C++ 无法找到向量的最小时间值
基本上,我试图创建一个函数,在时间值向量中找到最小值。它通过创建克隆向量并删除除最小值以外的所有内容来实现这一点。这段代码使用了一个助手函数“Issmeller”来获得结果,但我已经验证了另一个函数工作正常C++ 无法找到向量的最小时间值,c++,C++,基本上,我试图创建一个函数,在时间值向量中找到最小值。它通过创建克隆向量并删除除最小值以外的所有内容来实现这一点。这段代码使用了一个助手函数“Issmeller”来获得结果,但我已经验证了另一个函数工作正常 tm findMin(vector<tm> myvector) { vector<tm> tempvector = myvector; for (vector<tm>::iterator it = tempvector.begin();
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();
}
代码将迭代三次。这是每次“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值会在迭代过程中引起问题,但是我该如何解决这个问题呢
但我该如何着手解决这个问题呢
你问了,所以这里有一个答案
#include <algorithm>
//...
tm findMin(const vector<tm>& myvector)
{
return *std::min_element(myvector.begin(), myvector.end(),
[&](tm& v1, tm& v2) { return isSmaller(v1, v2); });
}
您的函数应该是正确的(或者从一开始就应该是正确的)const
。您没有更改原始传入向量,因此它应该是一个const
引用。如果isSmaller
不改变这两个参数中的任何一个,那么它们也应该是const
引用
下面是一个示例,显示仅比较日期中的秒数。这应该让您了解如何实现适当的
isSmaller
功能。您可以通过不制作任何内容的临时副本,然后不首先擦除任何内容来修复它。在向量中寻找某个事物的最小值从来都不需要这样的东西。一个简单的for
循环,里面有一个比较,其他什么都没有,总是足够的,不管“更小”的定义有多复杂。“它通过创建一个克隆向量并删除除最小值以外的所有内容来实现这一点”-你为什么认为这是一个很好的实现方法?std::min_元素(time_vector.begin(),time_vector.end(),[&](time_type&v1,time_type&v2){return/*如果v1
--为什么不这样做,而不是现在的复杂代码呢?你所做的是设计用来做的。@OP这听起来像,但在你的辩护中,你指定了“X”和“Y”.但是你发布了一个类似于“Y”的解决方案来解决“X”问题。@Monzaku你是什么意思std::min_元素不起作用?如果您没有发布您的isSmaller
实现,这就是您的帖子中缺少的内容。如果您阅读min_element
的文档,您会看到要求是什么——显然isSmaller
一定违反了这些要求。
#include <algorithm>
//...
tm findMin(const vector<tm>& myvector)
{
return *std::min_element(myvector.begin(), myvector.end(),
[&](tm& v1, tm& v2) { return isSmaller(v1, v2); });
}
#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); });
}