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

时间:2018-02-22 07:01:39

标签: 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;
}

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

5 个答案:

答案 0 :(得分:7)

i.e-li element为您提供了元素的迭代器容器的最后一个元素。 See here:

enter image description here

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

vec.end()

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

答案 1 :(得分:6)

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

你想要的是

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

答案 2 :(得分:2)

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

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

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

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

vec.pop_back();

答案 3 :(得分:1)

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

答案 4 :(得分:0)

要删除向量的最后一个元素,还可以使用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()积极用于涉及回溯的问题,例如查找给定集合的所有可能子集。希望对您有帮助