C ++ vector.end()给出范围结果 - 请指教

时间:2016-03-09 20:45:32

标签: c++ vector

在我的部分代码中,我使用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之后的一个单元格!

有一个简单的解决方法吗?我想将它与我的查找算法一起使用。

3 个答案:

答案 0 :(得分:2)

每个STL集合上的

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(深度); }