当我尝试插入位置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 ++向量实现的奇怪行为,不是吗? 我做错了什么?
答案 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()
的插入具有未定义的行为。结束迭代器始终指向最后一个元素。 容量无关紧要。