对于我使用的任何STL容器,如果我使用迭代器的默认构造函数声明一个该容器类型的迭代器,那么这个迭代器将被初始化为什么?
例如,我有:
std::list<void*> address_list;
std::list<void*>::iterator iter;
iter将被初始化为什么?
对于我使用的任何STL容器,如果我使用迭代器的默认构造函数声明一个该容器类型的迭代器,那么这个迭代器将被初始化为什么?
例如,我有:
std::list<void*> address_list;
std::list<void*>::iterator iter;
iter将被初始化为什么?
按照惯例,容器的“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
。默认构造函数将迭代器初始化为一个奇异值:
迭代器也可以有不与任何序列相关联的奇异值。 [ 例如: 在声明未初始化的指针
x
(如int* x;
)之后, 必须始终假定x
具有指针的奇异值。— 结束示例]
对于这些奇异值,大多数表达式的结果是未定义的。 [24.2.1 §5]
<叹气>
这句话通俗易懂的意思是什么? - sbi迭代器未初始化,就像 int x;
声明一个未初始化的整数一样。它没有一个正确定义的值。
NULL
是指针可能具有的一个值,而不是迭代器。虽然所有指针都是迭代器,但并非所有迭代器都是指针。 - sbi
std::list<void*>::iterator iter;
是一个定义。虽然所有的定义都是声明,但不是定义的声明将是:extern std::list<void*>::iterator iter;
。 - sbi