c++ - 为什么我不能取消引用迭代器?

标签 c++ iterator

如果我有一个对象 vector (普通对象,不是指针或引用),为什么我不能这样做?

Object* object;

object = vectorOfObjects.end();

object = &vectorOfObjects.end();

object = &(*vectorOfObjects.end());

如果“对象”是引用,也是同样的问题。

最佳答案

它们是三个独立的错误:

object = vectorOfObjects.end();

不会工作,因为 end() 返回一个迭代器,而 object 是一个指针。这些通常是不同的类型( vector 可以使用原始指针作为迭代器,但并非所有实现都这样做。其他容器需要特殊的迭代器类型)。

object = &vectorOfObjects.end();

不起作用,因为您获取了返回的迭代器的地址。也就是说,您得到一个指向迭代器的指针,而不是一个指向 Object 的指针。

object = &(*vectorOfObjects.end());

不起作用,因为 end 迭代器未指向有效元素。它指向序列末尾的一个。因此,它不能被取消引用。您可以取消引用序列中的最后一个元素(即 --vectorOfObjects.end()),但不能取消引用指向过去结尾的迭代器。

最后,潜在的问题/困惑可能是您认为迭代器可以转换为指针。一般来说,不能。如果您的容器是 vector ,则可以保证元素是连续分配的,就像在数组中一样,因此指针将起作用。但是对于 list 来说,指向元素的指针是无用的。它不会为您提供到达下一个 元素的任何方式。

关于c++ - 为什么我不能取消引用迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9141123/

相关文章:

c++ - 简单的 OpenGL 纹理贴图不起作用?

Java Iterator<E>,类型 E 的继承

java - 从 Java HashMap 中提取 ith 值的有效方法?

java - 如何迭代整个 HashMap

javascript - 是否有 javascript 或 lodash 函数可以轻松迭代对或三元组

c++ - 如果列表为空,std list 反向迭代器的尾后迭代器将失效

c# - 将现有的 QWidget 停靠在 QWindow 中

c++ - gnu c++如何实现new和delete

c++ - 将重载函数转换为模板仿函数

c++ - 深奥的 JScript 托管问题:IDispatch::Invoke 返回 SCRIPT_E_PROPAGATE 时的错误代码在哪里?