基本上,我正在尝试创建一个在时间值向量中找到最小值的函数。它通过创建克隆向量并删除除最小值以外的所有内容来实现此目的。这段代码使用了辅助函数“ 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
该代码将迭代3次。这是“ it”值每次显示的内容:
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)
我猜想删除it值会在迭代过程中引起问题,但是我该如何解决呢?
答案 0 :(得分:1)
但是我该如何解决呢?
您问过,所以这是一个答案。
#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并使用一个(有效的)谓词,如果{{1 }},否则为true
。
编辑:
对于所示的实现,您的v1 < v2
函数必须正确false
。另外,这要求lambda的参数也为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
的引用。
这里是Live Example,显示仅比较日期中的秒数。这应该使您了解如何实现适当的isSmaller
函数。