C++ vector.end() 给出超出范围的结果 - 请告知



在我的部分代码中,我使用 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); }

最新更新