我可以用 null 初始化一个迭代器吗?如果不是,为啥?
Posted
技术标签:
【中文标题】我可以用 null 初始化一个迭代器吗?如果不是,为啥?【英文标题】:Can I initialize an iterator with null, and if not why?我可以用 null 初始化一个迭代器吗?如果不是,为什么? 【发布时间】:2020-01-31 05:32:47 【问题描述】:我正在尝试将迭代器初始化为 NULL
,但它不起作用。谁能帮帮我?
如果指针可以用 null 初始化,为什么我们不能为迭代器这样做?
vector<int> bob;
vector<int>::iterator it=NULL;
我想在类构造函数中初始化一个迭代器,以便在创建类的对象时,将迭代器设置为NULL
(默认)。
【问题讨论】:
iterator
类似于指针,但不一定是指针。
注意:如果你告诉我们你为什么要这样做,我相信有人可以给你一个可行的选择。
是什么让您想知道“为什么我们不能为迭代器这样做”?否则会发生什么?也许制作一个minimal reproducible example 来详细演示和/或解释。
除了你不能,更相关的问题是,你为什么要这样做?你以后用这个迭代器做什么?第一次赋值为 null ?
@WhozCraig “第一次赋值为 null”是您的意思,不是吗?
【参考方案1】:
不,通常您不能使用NULL
初始化迭代器。迭代器要求不要求迭代器可以从整数类型或std::nullptr_t
(NULL
可以具有的可能类型)分配或初始化。
尝试这样做是没有意义的。根本不需要它。但是由于您没有解释为什么要尝试这样做,所以我真的无法提出任何进一步的建议。
关于您在 cmets 中的进一步问题:您可以值初始化每个转发迭代器:
vector<int>::iterator it; // value-initialized
从 C++14 开始,您可以保证比较以这种方式构造的相同类型的迭代器比较相等。
所有容器迭代器都是前向迭代器。
【讨论】:
谢谢,@walnut 我想知道的答案是“我认为迭代器就像一个包含元素地址的指针,如果我可以像(ptr = NULL)一样用NULL初始化一个指针,为什么我不能像 (it = NULL)" 那样使用迭代器" @N.SANDEEPREDDYsandeep 这就像一个指针,但它不是。同理,引用就像指向另一个变量的指针,但它永远不能为 NULL。 @N.SANDEEPREDDYsandeep 指针是迭代器,但不保证迭代器是指针。很多时候,迭代器不是指针。事实上,某些类型的迭代器甚至根本不使用指针,而是使用索引或偏移量。迭代器需要 ACT LIKE 指针,但不一定是 BE 指针。 我想在类构造函数中初始化一个等于 NULL 的迭代器的默认值,以便在初始化类的对象时,迭代器应该设置为 NULL(默认)但它不会发生。 谢谢@all,我得到了与我的问题相关的答案,但困惑还没有结束。我需要在某个时间解决与 c++ 中的迭代器相关的问题【参考方案2】:对于迭代器,与 NULL
或 null_ptr
的最佳等效值是 container::end()
值。它同样不指向容器的有效元素。因此,不要测试谓词(i == null_ptr)
,而是测试(i == v.end())
,并初始化为auto i = v.end();
。
只有在拥有容器之后才能初始化迭代器。但这在实践中不是问题,因为如果没有它所引用的容器,迭代器就毫无意义。
如果您有使用迭代器的复杂代码,并且您想在函数中隔离该代码,则必须将两个迭代器传递给函数:当前或开始迭代器,以及结束迭代器。这就是 STL 的作用。
【讨论】:
但是你需要一个v
。如果没有怎么办?以上是关于我可以用 null 初始化一个迭代器吗?如果不是,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
some_dict.items()是Python中的迭代器吗?
some_dict.items() 是 Python 中的迭代器吗?