基本上我试图创建抽出时间值的向量中的最小值的函数。它通过创建克隆载体和删除除最小值都做到这一点。此代码使用一个辅助功能“isSmaller”,达到的结果,但我已经验证了这等功能工作正常。
tm findMin(vector<tm> myvector) {
vector<tm> tempvector = myvector;
for (vector<tm>::iterator it = tempvector.begin();
it!=tempvector.end(); ++it) {
if (isSmaller(*it, *it++) == true) {
tempvector.erase(it);
} else {
tempvector.erase(it++);
}
it = tempvector.begin();
}
return tempvector.front();
}
当测试此,这些是放置到所述载体(按顺序)的值。
Fri Dec 31 00:00:00 1999
Tue Dec 11 11:11:11 1900
Mon Jun 5 05:05:05 1950
Mon Apr 3 03:03:03 1933
Fri Dec 31 00:00:00 1999
该代码将遍历三次。这就是“它”值,每次显示:
it start: Fri Dec 31 00:00:00 1999
isSmaller = true;
it end: Tue Dec 11 11:11:11 1900
it start: Mon Jun 5 05:05:05 1950
isSmaller = true;
it end: Tue Dec 11 11:11:11 1900
it before: Mon Apr 3 03:03:03 1933
isSmaller = false;
Segmentation fault (core dumped)
我猜迭代过程中删除它的值引起的问题,但我将如何去解决这个?
但我怎么会去修复呢?
你问,所以这里是一个答案。
#include <algorithm>
//...
tm findMin(const vector<tm>& myvector)
{
return *std::min_element(myvector.begin(), myvector.end(),
[&](tm& v1, tm& v2) { return isSmaller(v1, v2); });
}
假设是isSmaller
返回true
如果第一个参数是实际上比第二个参数少,false
否则(确保这是一个功能是如何工作的)。
鉴于此,没有必要删除元素,拷贝到临时矢量等所有需要的是调用std::min_element用(工作)断言,如果true
返回v1 < v2
,否则false
。
编辑:您isSmaller
功能需要为显示的实施const
正确。此外,需要的参数拉姆达是也const
,(这是不是之前):
#include <algorithm>
//...
bool isSmaller(const tm& v1, const tm& v2)
{
return // true or false;
}
tm findMin(const vector<tm>& myvector)
{
return *std::min_element(myvector.begin(), myvector.end(),
[&](const tm& v1, const tm& v2) { return isSmaller(v1, v2); });
}
你的函数应该已经做出(或应该已经从一开始)const
正确。你是不是改变原有传入向量,所以它应该是一个const
参考。如果isSmaller
不改变既不是两个参数,他们也应该是const
引用。
这里是一个Live Example,显示的日期比较只是秒。这应该给你如何实现正确的isSmaller
功能的想法。