什么是迭代器的默认值?

The*_*oid 60 c++ containers iterator stl default

对于我正在使用的任何STL容器,如果我使用迭代器的默认构造函数声明一个迭代器(此特定容器类型),迭代器将初始化为什么?

例如,我有:

std::list<void*> address_list;
std::list<void*>::iterator iter;
Run Code Online (Sandbox Code Playgroud)

什么会被初始化?

Unc*_*ens 52

按照惯例,容器的"NULL迭代器"用于表示没有结果,比较等于结果container.end().

 std::vector<X>::iterator iter = std::find(my_vec.begin(), my_vec.end(), x);
 if (iter == my_vec.end()) {
     //no result found; iter points to "nothing"
 }
Run Code Online (Sandbox Code Playgroud)

但是,由于默认构造的容器迭代器不与任何特定容器相关联,因此它没有任何好处.因此它只是一个未初始化的变量,唯一合法的操作就是为它分配一个有效的迭代器.

 std::vector<X>::iterator iter;  //no particular value
 iter = some_vector.begin();  //iter is now usable
Run Code Online (Sandbox Code Playgroud)

对于其他类型的迭代器,这可能不是真的.例如istream_iterator,在默认情况下,默认构造的迭代器表示(比较等于)istream_iterator已达到输入流的EOF的a.

  • 根据该提议编写auto ni = vector <int> :: iterator()将创建一个空向量<int>迭代器,它将与同一类型的任何其他迭代器进行比较 (4认同)
  • 有一个值初始化迭代器存在的建议.见http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3644.pdf (3认同)

fre*_*low 22

默认构造函数将迭代器初始化为单数值:

迭代器也可以具有与任何序列无关的奇异值.[示例:在声明未初始化的指针x(与int*x;一样)之后,必须始终假定x具有指针的奇异值.-end example] 大多数表达式的结果未定义为奇异值 [24.2.1§5]

  • 我的标准厌恶再次引起轰动.`<sigh>`这在可理解的演讲中意味着什么? (16认同)
  • @sbi:将"奇异"的所有实例替换为"怪异".你不允许对它做任何事情,因为它处于一种奇怪的状态. (9认同)
  • @sbi:嗯,段落不断,我决定削减它.基本上,您不允许使用单数值执行任何有用的操作,例如取消引用或比较它. (2认同)
  • @jalf:谢谢你的澄清.我认为"奇异价值"是一个非常有创意的名字,可能具有任何可能的价值.肯定会把我扔掉...... (2认同)

Jes*_*erE 11

迭代器未初始化,就像int x;声明一个未初始化的整数一样.它没有正确定义的值.

  • @sbi:bot是"但不是"的新缩写?:) (4认同)
  • @The Void:你的问题毫无意义.`NULL`是一个值_pointers_可能有,bot迭代器.虽然所有指针都是迭代器,但并非所有迭代器都是指针. (3认同)
  • 有没有办法将iter初始化为NULL? (2认同)
  • @JesperE:它很可能已初始化(在许多情况下,迭代器是类,它们将具有一个用于初始化内容的默认构造函数)。 (2认同)