在我的部分代码中,我使用push_back
从txt文件中形成一个向量:
while (!layerf.eof()) {
for (int i=0; i<kl.nlyr+1; i++) {
std::getline(layerf,line);
depth = atof(line.c_str()) - kl.depth;
hlyr.push_back(depth);
}
}
我想输入{1,2,3,4}。
之后,我需要找到一个给定的值,因为zz位于上面的两个元素hlyr之间,使用以下部分:
std::vector<double>::iterator loc;
loc = std::upper_bound (hlyr.begin(), hlyr.end(), zz);
现在问题是hlyr.end给了我无意义的价值,2 e-98,这就像它没有初始化!我的矢量大小很好,即使我在视觉工作室的“观察”窗口中查看矢量,一切都是正确的,但矢量结束是无意义的。
如果我将上面的矢量调整为4则没有任何变化。但是如果我调整为3,它将从向量中删除最后一个单元格,然后vector.end()
将显示4!似乎vector.end
指向vector.size
之后的一个单元格!
有一个简单的解决方法吗?我想将它与我的查找算法一起使用。
答案 0 :(得分:2)
end()
是集合末尾的迭代器;正如你所做的那样取消引用它是未定义的行为。
如果向量不为空,你可以这样做以获得向量中最后一个元素的迭代器:
auto last = hylr.end();
--last;
如果它是空的,则更多未定义的行为!
“未定义的行为”是标准语言:如果它没有达到您想要的效果,您就不会抱怨。
答案 1 :(得分:1)
end
的迭代器引用非法元素是正常的,这允许它用作表达&#34;而不是在此容器中的方式&#34;。它还允许你写:
for (auto it = v.begin(); it != v.end(); it++)
如果end
有效,您将无法执行上述操作。
在向量的情况下,它返回一个迭代器,该迭代器引用超出当前向量末尾的第一个元素。通过upper_bound
来电,您只需检查end
,即表明您的值高于向量中的任何值。
auto loc = std::upper_bound (hlyr.begin(), hlyr.end(), zz);
if (loc == hlyr.end())
// there was nothing > zz in the vector
答案 2 :(得分:-2)
您可以定义所需的变量depondon类型,并将(hlyr.push_back(depth);)保存在其中,例如: {int x = hlyr.push_back(深度); }