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

C++ C++;在任意位置插入/放置元素时给出分割错误的向量,c++,vector,C++,Vector,当我尝试在位置3插入时,下面给出了一个分段错误 vector<int> a; a.insert(a.begin(), 10); a.insert(a.begin()+1, 9); a.insert(a.begin()+3, 7); 向量a; a、 插入(a.begin(),10); a、 插入(a.begin()+1,9); a、 插入(a.begin()+3,7); 我认为这是因为我超出了容量,事实上这段代码是有效的: vector<int> a=vector<

当我尝试在位置3插入时,下面给出了一个分段错误

vector<int> a;
a.insert(a.begin(), 10);
a.insert(a.begin()+1, 9);
a.insert(a.begin()+3, 7);
向量a;
a、 插入(a.begin(),10);
a、 插入(a.begin()+1,9);
a、 插入(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);
向量a=向量(3);
a、 插入(a.begin(),10);
a、 插入(a.begin()+1,9);
a、 插入(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);
向量a=向量(3);
a、 插入(a.begin(),10);
a、 插入(a.begin()+1,9);
a、 插入(a.begin()+3,7);

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

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

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

std::reserve
可能会改变容量;i、 e.它会导致分配更多内存

std::resize
可能会更改大小;i、 e.它可以导致从向量中添加或删除元素


在第三个代码片段中,向量初始化为
3
。然后继续为
100
元素保留
空间,但不添加额外的元素,因此
a.begin()+16
点超过
a.end
。如果您将
reserve
更改为
resize
,则您的行为将与您预期的一样。

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

std::reserve
可能会改变容量;i、 e.它会导致分配更多内存

std::resize
可能会更改大小;i、 e.它可以导致从向量中添加或删除元素

在第三个代码片段中,向量初始化为
3
。然后继续为
100
元素保留
空间,但不添加额外的元素,因此
a.begin()+16
点超过
a.end
。如果您将
reserve
更改为
resize
,则您的行为将与您预期的一样

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

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

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


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

可能的重复:与其假设,为什么不阅读文档?可能的重复:与其假设,为什么不阅读文档?请看第三段代码:如何解释?向量的大小仍然只有6,您正在尝试访问第17个元素。与其打印“a.capacity()”,不如看看“a.size()”@vvigilante实际上,不需要进一步的解释——它是UB,所以任何事情都可能发生。看看第三段代码:你怎么解释呢?向量的大小仍然只有6,你正试图访问第17个元素。与其打印“a.capacity()”不如看看“a.size()”@vvigilante实际上,不需要进一步解释——它是UB,所以任何事情都可能发生。