【问题标题】:Erasing vector.end() fails [duplicate]擦除vector.end()失败[重复]
【发布时间】:2015-04-09 05:06:42
【问题描述】:

为什么使用vector.erase(vector.end()) 会产生一个

Segmentation fault (core dumped)

使用此代码时:

#include <iostream>
#include <vector>
using namespace std;

void printMe(vector<int>& v){ for(auto &i:v) cout<<i<<" "; cout<<"\n"; }

int main() {
    vector<int> c = { 1,2,3,4,5,6,7,8};
    printMe(c);
    c.erase(c.begin());
    printMe(c);
    c.erase(c.begin());
    printMe(c);
    // c.erase(c.end()); //will produce segmentation fault
    // printMe(c);
    return 0;
}

我对这些迭代器有点陌生,所以这让我措手不及。虽然我知道存在vector.pop_back()。我很想知道究竟是什么原因造成的。

程序的link

【问题讨论】:

  • vector.end() 是过去的迭代器。它不指向可以擦除的元素。
  • 因为 C++ 的约定是范围是半开的:[begin, end)
  • Begin 是您从第一个元素开始的地方。 End 是你结束的地方,当你过去最后一个元素时。 (您可能需要rbegin,这是元素序列以相反顺序开始的位置,即最后一个元素。)如果begin 是第一个元素,end 是最后一个元素,那么插入函数将如何工作?如果它在指定的迭代器之后插入,则不能将某些内容放在开头。如果它之前插入,你不能把东西放在最后。
  • @DavidSchwartz ,我明白了 :) 对于空范围, begin() 将等于 end() ,这是有道理的。

标签: c++ vector stl iterator


【解决方案1】:

vector::end() 不指向最后一个元素,它指向就在最后一个元素之后的元素。

引用cplusplus.com

std::vector::end

返回一个迭代器,该迭代器引用 矢量容器。

过去的元素是随后的理论元素 向量中的最后一个元素。它不指向任何元素,并且 因此不应被取消引用。

因为标准库的函数使用的范围不 包括由它们的关闭迭代器指向的元素,这个函数 常与vector::begin结合使用来指定范围 包括容器中的所有元素。

因此,它与erase() 无关,因此出现错误。


替换

c.erase(c.end());

c.erase(c.end() - 1);

【讨论】:

  • 没有erase 的重载需要reverse_iteratorstd::reverse_iterator 确实允许您使用 .base() 恢复底层迭代器,但 rbegin().base() 只是 end(),所以我们回到了开始的地方。
  • @T.C.你是对的,我已经删除了reverse_iterator 部分。因为,我们仍然必须使用.base() 将反向迭代器转换为正向迭代器,这没有任何生产用途。
【解决方案2】:

vector::end() 指向最后一个元素之后的一个。

因此它不指向一个元素。

因此,没有什么可删除的。

如果您想删除最后一个元素,您需要删除之前的元素,就像您在 ideone 链接中所做的那样。

【讨论】:

    【解决方案3】:

    Vector 的end() 返回一个迭代器,该迭代器引用应该位于容器中最后一个元素之后的元素。

    所以你试图擦除不属于你的内存,这会产生 SIGSEGV (11)。

    【讨论】:

      【解决方案4】:

      正如上面提到的 volerag 只是替换 c.erase(c.end()); 和 c.erase(c.end()-1);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 2020-07-27
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多