从矢量C++中删除最后一个元素时的分段错误

Bha*_*wan 3 c++ stl stdvector

我创建了一个简单的C++程序来测试C++向量中erase()的行为.

这是我的代码:

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

int main() {
    // your code goes here

    vector<int> vec;

    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);

    cout << vec[0] << " " << vec[1] << " " << vec[2] << endl;

    vec.erase(vec.end());
    //vec.erase(vec.begin());

    cout << vec.size() << endl;

    vec.push_back(12);
    vec.push_back(10);

    cout << vec[0] << " " << vec[1] << " " << vec[2] << endl;


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是上面的代码在尝试擦除向量中的最后一个元素时给出了分段错误.但是当我使用begin()擦除第一个元素时,它工作正常.我无法理解它背后的原因.任何帮助将受到高度赞赏.

son*_*yao 11

问题是std :: vector :: end返回一个迭代器到元素的最后一个元素之后的元素,而不是最后一个元素.

你想要的应该是什么

vec.erase(vec.end() - 1); // trying to erase the last element of vec
Run Code Online (Sandbox Code Playgroud)

  • 通过投票来抵消不公平的投票 (2认同)

Fan*_*Fox 8

vec.end()给你在容器的最后一个元素后面的元素的迭代器.看这里:

在此输入图像描述

试图擦除它是未定义的行为.您应该通过以下任一方式擦除:

vec.erase(vec.end() - 1);
Run Code Online (Sandbox Code Playgroud)

要么

 vec.erase(vec.begin() + vec.size() - 1);
Run Code Online (Sandbox Code Playgroud)


R S*_*ahu 6

std::vector::end()返回一个迭代器,该迭代器是对象最后一个元素之后的一个。它对于擦除无效。要从 a 中删除最后一个元素vector,您需要使用指向最后一个元素的迭代器。

你可以用begin() + size - 1它。

size_t size = vec.size();
vec.erase(vec.begin() + size - 1);
Run Code Online (Sandbox Code Playgroud)

更好的是,使用std::vector::pop_back().

vec.pop_back();
Run Code Online (Sandbox Code Playgroud)