在我的部分代码中,我使用 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,就像它没有被初始化一样!我的矢量大小很好,即使我在Visual Studio的"监视"窗口中查看矢量也一切正常,但是矢量结束是无稽之谈。
如果我将上面的矢量大小调整为 4,则没有任何变化。但是如果我调整为 3,它将从矢量中删除最后一个单元格,然后vector.end()
将显示 4!似乎vector.end
指向一个vector.size
个单元格!
有没有简单的解决方法?我想将它与我拥有的查找算法一起使用。
STL 集合上的end()
都是集合末尾的迭代器;在你正在做的时候取消引用它是未定义的行为。
不为空,则可以执行此操作来获取向量中最后一个元素的迭代器:
auto last = hylr.end();
--last;
如果它是空的,则更多未定义的行为!
"未定义的行为"是标准语言:如果它没有做你想做的事,你就不会抱怨。
迭代器end
引用非法元素是正常的,这允许它用作表达"不在此容器中"的一种方式。它还允许您编写:
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
您可以定义所需的变量 depondon 类型并保存 (hlyr.push_back(深度);)例如:{int x = hlyr.push_back(depth); }