当在任意位置插入/放置元素时,C++向量会导致分割错误
C++ vector giving segmentation fault when inserting/emplacing elements in arbitrary positions
当我尝试在位置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()
之外插入具有未定义的行为。结束迭代器总是指向最后一个元素之后。容量无关紧要。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在C++中调整向量中的索引
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么