“reserve”和“iterator”与std::vector的关系

问题描述 投票:0回答:2

reserve()
方法与此
iterator
对象一起使用时,程序会产生意外错误。

当我在没有它的情况下使用

reserve()
方法时,它会按预期工作,但是当我使用
iterator
时,它根本不起作用。

有效的代码:

vector <int> nums{1,2,3,4,5}, numsT{};

numsT.reserve(50);
numsT.insert(numsT.begin(), nums.begin(), nums.end() - 1);

不起作用的代码:

vector <int> nums{ 1,2,3,4,5 }, numsT{};
vector <int>::iterator first{ nums.begin() }, last{ nums.end() - 1 }, position{ numsT.begin() };
 
numsT.reserve(50);
numsT.insert(position, first, last);
c++ iterator stdvector
2个回答
1
投票

该问题与您显式使用

iterator
类型无关,而仅与您在 before 调用
reserve
之前初始化它这一事实有关。

关于第二个片段:

正如您在

std::vector::reserve
文档中看到的:

如果new_cap大于capacity(),则所有迭代器(包括 end() 迭代器)并且对元素的所有引用都无效。

在您的情况下,您将

position
初始化为
numsT.begin()
,但随后保留
numsT
50 个元素。由于它是空的,所以几乎可以肯定新容量(至少 50)超过了现有容量,因此
position
无效。

因此后续调用:

numsT.insert(poistion, first, last);

调用 未定义的行为,因为

position
无效。

如果您在调用

first
之后初始化reserve
,它将起作用:

vector<int> nums{ 1,2,3,4,5 }, numsT{}; vector<int>::iterator first{ nums.begin() }, last{ nums.end() - 1 }; numsT.reserve(50); vector<int>::iterator position{ numsT.begin() }; numsT.insert(position, first, last);

第一个片段起作用的原因:

在第一个片段中,您用

insert

 调用 
numsT.begin()
。当 
reserve
 已经发生并因此有效时,此时对其进行评估。


旁注: 最好避免
using namespace std;

 - 请参阅更多相关信息
这里


0
投票

cppreference 说:

如果

new_cap

 大于 
capacity()
,则所有迭代器(包括 
end()
 迭代器)以及对元素的所有引用
无效。

因此,如果发生重新分配(这里就是这种情况),迭代器

position

将不再有效。调用 
numsT.begin()
 将在保留后返回不同的值。

© www.soinside.com 2019 - 2024. All rights reserved.