很难找到载体的最小时间值

问题描述 投票:0回答:1

基本上我试图创建抽出时间值的向量中的最小值的函数。它通过创建克隆载体和删除除最小值都做到这一点。此代码使用一个辅助功能“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)

我猜迭代过程中删除它的值引起的问题,但我将如何去解决这个?

c++
1个回答
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用(工作)断言,如果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功能的想法。

© www.soinside.com 2019 - 2024. All rights reserved.