【问题标题】:C++ vector iterator + offset out of rangeC ++向量迭代器+偏移超出范围
【发布时间】:2017-01-16 00:17:17
【问题描述】:

我有在 Xcode 上编译的 c++ 代码,但是当我尝试在 Visual Studio 2015 上编译它时,我收到一个错误,即迭代器偏移超出范围。有人可以尝试帮助解决这个问题:

typename std::vector< HNode<T>* >::iterator ti;

while(temp.size() > 1) {
    std::sort(temp.rbegin(), temp.rend(), HNodePointerCountComparator<T>());

    ti = temp.end();
    ti -= 1;

    temp.push_back(new HNode<T>());
    temp.back()->setCount(temp.back()->getCount() + (*ti)->getCount());
    temp.back()->setLeft(*ti);

    temp.erase(ti);

    ti -= 1; //Debug assertion failed: iterator + offset out of range

    temp.back()->setCount(temp.back()->getCount() + (*ti)->getCount());
    temp.back()->setRight(*ti);

    temp.erase(ti); 
}

【问题讨论】:

  • 我有可以编译的 c++ 代码——问题不是编译。当您的程序运行时,这就是问题所在。话虽如此,您究竟想用这段代码完成什么?不建议在迭代同一 vector 时从 vector 中擦除。
  • 另外,该程序有一个对您隐藏的错误,即使您说它在 XCode 中运行。很高兴 Visual Studio 检测到它。

标签: c++ vector iterator range offset


【解决方案1】:

erase 使ti 无效,因此当您尝试修改它之后,VS 中的调试版本会对其进行标记。

你想做的是

ti = temp.erase(ti);

这将使ti 引用您删除的元素之后的第一个元素。在实践中,这意味着 ti 不会改变(因为第一个元素将被向下移动以替换被擦除的元素),但使用 Visual Studio 进行调试构建中的迭代器跟踪会对此感到满意。

【讨论】:

  • 另请注意,push_back 也可能使 ti 无效,如果它导致向量中的重新分配。
【解决方案2】:

除了提供的其他答案之外,这也可以使迭代器无效:

   ti = temp.end();
   ti -= 1;
   temp.push_back(new HNode<T>());

调用push_back() 会导致迭代器失效。所以你的ti 迭代器在调用push_back 后可能无效。

我们不应给出您遇到这些问题的原因,而应准确说明您在您编写的 while 循环中的目标。我相信您会得到答案,不仅会说明您做错了什么,还会说明如何正确编写擦除代码。

避免这些问题的最佳方法是不要编写一个循环,在遍历向量时从std::vector 中删除项目,同时在向量中存储迭代器。实现这一点的方法是使用erase-remove idiom,而不是尝试管理迭代器和while 循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2014-09-27
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多