当在任意位置插入/放置元素时,C++向量会导致分割错误

C++ vector giving segmentation fault when inserting/emplacing elements in arbitrary positions

本文关键字:向量 C++ 错误 分割 元素 位置 任意 插入      更新时间:2023-10-16

当我尝试在位置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++向量实现的一种奇怪行为,不是吗?我做错了什么?

std::vector容量大小有不同的概念。大小是当前存储在矢量中的元素的数量,而容量是可以存储在当前分配的空间量中的元素数量。

CCD_ 2可以改变容量;即它可以导致分配更多的存储器。

CCD_ 3可以改变大小;即,它可以导致元素被添加到向量中或从向量中移除。

在您的第三个代码段中,向量被初始化为大小为3。然后转到100元素的reserve空间,但没有添加额外的元素,因此a.begin()+16指向a.end。如果您将reserve更改为resize,那么您的行为将如您所期望的那样。

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

我觉得这是因为我超过了的容量

你想错了。在vector::end()之外插入具有未定义的行为。结束迭代器总是指向最后一个元素之后。容量无关紧要。