C ++向量在任意位置插入/放置元素时给出分段错误

时间:2015-11-18 14:06:11

标签: c++ vector

当我尝试插入位置3时,以下给出分段错误

vector<int> a;
a.insert(a.begin(), 10);
a.insert(a.begin()+1, 9);
a.insert(a.begin()+3, 7);

我认为这是因为我超出了容量,实际上这段代码有效:

vector<int> a=vector<int>(3);
a.insert(a.begin(), 10);
a.insert(a.begin()+1, 9);
a.insert(a.begin()+3, 7);

...但是如果您尝试这样做,它会像第一个那样导致分段错误,尽管容量正在正确更新

vector<int> a=vector<int>(3);
a.insert(a.begin(), 10);
a.insert(a.begin()+1, 9);
a.insert(a.begin()+3, 7);
cout<< a.capacity() << endl;
a.reserve(100);
cout<< a.capacity() << endl;
a.insert(a.begin()+16, 4);

它似乎是C ++向量实现的奇怪行为,不是吗? 我做错了什么?

3 个答案:

答案 0 :(得分:2)

std::vector容量 size 的单独概念。大小是当前存储在向量中的元素数,而容量是可以存储在当前分配的空间量中的元素数。

std::reserve可能会改变容量;即它可以分配更多的内存。

std::resize可能会改变大小;即它可以导致元素被添加到向量中或从向量中移除。

在第三个代码段中,向量初始化为3。然后,您转到reserve空格以获取100元素,但不会添加额外元素,因此a.begin()+16指向a.end之后。如果您将reserve更改为resize,那么您的行为将符合您的预期。

答案 1 :(得分:0)

您尝试访问尚未创建的内存。 Insert为向量添加元素空间,在前两个插入中,您引用已分配的内存(向量的第一个和第二个元素)。第三个insert试图引用数组的第四个元素,但尚未分配/创建。

答案 2 :(得分:0)

  

我认为是因为我超出了容量

你错了。超出vector::end()的插入具有未定义的行为。结束迭代器始终指向最后一个元素。 容量无关紧要。