将
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);
该问题与您显式使用
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;
- 请参阅更多相关信息这里。
cppreference 说:
如果因此,如果发生重新分配(这里就是这种情况),迭代器
new_cap
大于capacity()
,则所有迭代器(包括end()
迭代器)以及对元素的所有引用 无效。
position
将不再有效。调用
numsT.begin()
将在保留后返回不同的值。