找不到向量的最小时间值

时间:2019-02-02 23:30:31

标签: c++

基本上,我正在尝试创建一个在时间值向量中找到最小值的函数。它通过创建克隆向量并删除除最小值以外的所有内容来实现此目的。这段代码使用了辅助函数“ 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值会在迭代过程中引起问题,但是我该如何解决呢?

1 个答案:

答案 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函数。