【发布时间】:2015-07-03 01:34:25
【问题描述】:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v(10,0);
vector<int>::iterator ff = v.begin();
v.assign(3, 11);
cout << *ff << endl;
cin.get();
return 0;
return 0;
}
猜测:
编译器有问题? 有什么我不知道的?
详情:
当我看到在 c++ api 中指定向量的函数时。 偶然我想知道向量中分配的存储空间以及是否可以使用迭代器作为指针。 所以我写这个。 但它错了。我想也许在通话时分配它重新分配内存。 但我谷歌它。它说
“当且仅当新向量大小超过当前向量容量时,这会导致分配的存储空间自动重新分配。”
显然功能很大,所以它不应该重新分配。我疯了,我尝试了 devc++,它很好。为什么?
【问题讨论】:
-
v.assign()使您的迭代器无效,从而导致未定义的行为。 -
什么?无效...T_T 好吧...谢谢..
-
迭代器可以被定义为指针(根据标准),如果你的向量导致重新分配,它不知道有多少迭代器(这对于开销+非常复杂的重新分配来说真的是个坏主意时间方面),所以它基本上不在乎。举个例子:迭代器的开始是 0x00AA,当你插入它时,它变成了 0x0A00,但是你的迭代器仍然指向 0x00AA,它现在被定义为“免费抓取”(已删除),所以 UB 发生了跨度>
-
在 C++ 标准库中,指定了迭代器失效的各种场景,并且对于不同的容器是不同的。如果您有某种需要,您可以选择具有不同(更强?)失效保证的不同容器。
标签: c++ visual-studio vector iterator dev-c++