从向量 C++ 中删除最后一个元素时出现分段错误

Segmentation fault on erasing the last element from the vector C++

我创建了一个简单的 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;
}

问题是上面的代码在尝试从向量中删除最后一个元素时出现分段错误。但是当我使用 begin() 擦除第一个元素时,它工作正常。我无法理解其背后的原因。任何帮助将不胜感激。

vec.end() 为您提供容器最后一个元素 之后 元素的迭代器。 See here:

试图擦除它是未定义的行为。您应该通过执行以下任一操作来擦除:

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

或更好使用 pop back:

vec.pop_back();

 

问题是 std::vector::end returns 指向容器最后一个元素 之后的 元素的迭代器,而不是 最后一个元素.

你想要的应该是

vec.erase(vec.end() - 1); // trying to erase the last element of vec

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

你可以使用 begin() + size - 1

size_t size = vec.size();
vec.erase(vec.begin() + size - 1);

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

vec.pop_back();

您需要删除第 (vec.end - 1) 个元素,因为 vec.end 指的是向量容器中的 past-the-end 元素。

要删除向量的最后一个元素,您也可以使用vector::pop_back()函数。

例如:

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

int main() 
{ 
    vector<int> myvector{ 1, 2, 3, 4, 5 }; 
    myvector.pop_back(); 

    // Vector becomes 1, 2, 3, 4 

    for (auto it = myvector.begin(); it != myvector.end(); ++it) 
        cout << ' ' << *it; 
} 

pop_back() 积极用于涉及回溯的问题,例如查找给定集合的所有可能子集。希望对你有帮助