我正在尝试将一个迭代器初始化为NULL,但是它不工作。有人能帮助我吗?如果指针可以用null初始化,为什么迭代器不能这样做呢?
NULL
vector<int> bob; vector<int>::iterator it=NULL;
我想在类构造函数中初始化一个迭代器,这样在创建类的对象时,迭代器应该设置为NULL(默认值)。
lokaqttq1#
不可以,一般来说你不能用NULL初始化迭代器。迭代器的要求不要求迭代器可以从整数类型或std::nullptr_t赋值或初始化,NULL可能有这样的类型。这样做是没有意义的,根本没有需要,但既然你没有解释为何要这样做,我实在不能再提出任何建议。关于您在评论中提出的其他问题:您可以 * 值初始化 * 每个 * 前向迭代器 *:
std::nullptr_t
vector<int>::iterator it{}; // value-initialized
从C++14开始,你可以保证用这种方法构造的相同类型的迭代器比较结果相等。所有容器迭代器都是向前迭代器。
hwamh0ep2#
NULL或null_ptr的最佳等价物是container::end()的值,同样它也不指向容器的有效元素,因此,测试(i == v.end()),而不是测试 predicate (i == null_ptr),并初始化为auto i = v.end();。只有当你有了一个容器之后,你才能初始化迭代器,但这在实践中并不成问题,因为如果没有它所引用的容器,迭代器就毫无意义。如果你有复杂的使用迭代器的代码,并且你想在一个函数中隔离这些代码,你将不得不传递两个迭代器给这个函数:当前或开始迭代器和结束迭代器。这就是STL所做的。
null_ptr
container::end()
(i == v.end())
(i == null_ptr)
auto i = v.end();
idfiyjo83#
迭代器在创建时初始化。您可以检查其_Ptr成员是否为空:向量::迭代器p;如果(p._Ptr ==空)...(使用叮当声和叮当声)
3条答案
按热度按时间lokaqttq1#
不可以,一般来说你不能用
NULL
初始化迭代器。迭代器的要求不要求迭代器可以从整数类型或std::nullptr_t
赋值或初始化,NULL
可能有这样的类型。这样做是没有意义的,根本没有需要,但既然你没有解释为何要这样做,我实在不能再提出任何建议。
关于您在评论中提出的其他问题:您可以 * 值初始化 * 每个 * 前向迭代器 *:
从C++14开始,你可以保证用这种方法构造的相同类型的迭代器比较结果相等。
所有容器迭代器都是向前迭代器。
hwamh0ep2#
NULL
或null_ptr
的最佳等价物是container::end()
的值,同样它也不指向容器的有效元素,因此,测试(i == v.end())
,而不是测试 predicate(i == null_ptr)
,并初始化为auto i = v.end();
。只有当你有了一个容器之后,你才能初始化迭代器,但这在实践中并不成问题,因为如果没有它所引用的容器,迭代器就毫无意义。
如果你有复杂的使用迭代器的代码,并且你想在一个函数中隔离这些代码,你将不得不传递两个迭代器给这个函数:当前或开始迭代器和结束迭代器。这就是STL所做的。
idfiyjo83#
迭代器在创建时初始化。您可以检查其_Ptr成员是否为空:
向量::迭代器p;如果(p._Ptr ==空)...
(使用叮当声和叮当声)