对于我正在使用的任何STL容器,如果我使用迭代器的默认构造函数声明一个迭代器(此特定容器类型),迭代器将初始化为什么?
例如,我有:
std::list<void*> address_list;
std::list<void*>::iterator iter;
Run Code Online (Sandbox Code Playgroud)
什么会被初始化?
当你说:std :: advance的行为是什么时候:
std::vector<int> foo(10,10);
auto i = foo.begin();
std::advance(i, 20);
Run Code Online (Sandbox Code Playgroud)
什么是价值我?是foo.end()?
我知道擦除会在擦除点之后和之后使迭代器无效.考虑:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int>::iterator it = vec.end() - 1; //last element
vec.erase(vec.begin()); //shift everything one to the left, 'it' should be the new 'end()' ?
std::cout << (it == vec.end()); //not dereferencing 'it', just comparing, UB ?
Run Code Online (Sandbox Code Playgroud)
比较(而不是取消引用)无效的迭代器(it在这种情况下)是未定义的行为吗?如果没有,it == vec.end()保证是真的吗?
编辑:从顶部答案看,如果只是it一个奇异的值,这就是UB .但是在STL迭代器的上下文中,什么是单数和非奇异值?它似乎it是(或曾经)与容器相关联,因此it 非单数形式.
我很感激对此进行进一步的分析,谢谢.