迭代器的默认值是什么?

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

例如,我有:

std::list<void*> address_list;
std::list<void*>::iterator iter;

ITER 将被初始化为什么?

60392 次浏览

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

缺省构造函数将迭代器初始化为 单数值:

迭代器还可以具有与任何序列无关的奇异值。 [示例: 在声明未初始化的指针 x之后(与 int* x;一样) , 必须始终假定 x具有指针的单数值。 < em > ーー结束示例]
对于奇异值,大多数表达式的结果是未定义的 [24.2.15]

按照惯例,容器的“ 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"
}

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

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

对于其他类型的迭代器,这可能不是真的。例如,在 istream_iterator的情况下,默认构造的迭代器表示(相当于)一个已经到达输入流的 EOF 的 istream_iterator