我可以用 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_tNULL 可以具有的可能类型)分配或初始化。

尝试这样做是没有意义的。根本不需要它。但是由于您没有解释为什么要尝试这样做,所以我真的无法提出任何进一步的建议。


关于您在 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】:

对于迭代器,与 NULLnull_ptr 的最佳等效值是 container::end() 值。它同样不指向容器的有效元素。因此,不要测试谓词(i == null_ptr),而是测试(i == v.end()),并初始化为auto i = v.end();

只有在拥有容器之后才能初始化迭代器。但这在实践中不是问题,因为如果没有它所引用的容器,迭代器就毫无意义。

如果您有使用迭代器的复杂代码,并且您想在函数中隔离该代码,则必须将两个迭代器传递给函数:当前或开始迭代器,以及结束迭代器。这就是 STL 的作用。

【讨论】:

但是你需要一个v。如果没有怎么办?

以上是关于我可以用 null 初始化一个迭代器吗?如果不是,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

some_dict.items()是Python中的迭代器吗?

some_dict.items() 是 Python 中的迭代器吗?

Python中有速记初始化器吗?

如何为迭代器返回“null”值?

我可以使用 Firebase 动态链接作为 URL 缩短器吗?

C++ 嵌套迭代器