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

Sir*_*lot 3 c++ iterator

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

Object* object;

object = vectorOfObjects.end();
Run Code Online (Sandbox Code Playgroud)

要么

object = &vectorOfObjects.end();
Run Code Online (Sandbox Code Playgroud)

要么

object = &(*vectorOfObjects.end());
Run Code Online (Sandbox Code Playgroud)

如果'对象'是参考,也是同样的问题.

jal*_*alf 13

它们是三个独立的错误:

object = vectorOfObjects.end();
Run Code Online (Sandbox Code Playgroud)

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

object = &vectorOfObjects.end();
Run Code Online (Sandbox Code Playgroud)

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

object = &(*vectorOfObjects.end());
Run Code Online (Sandbox Code Playgroud)

因为end迭代器没有指向有效元素,所以不起作用.它指出了序列结束的一个.所以,它不能被解除引用.您可以取消引用序列中的最后一个元素(可能是--vectorOfObjects.end()),但不能指向超过末尾的迭代器.

最后,潜在的问题/混淆可能是您认为迭代器可以转换为指针.一般来说,它不能.如果您的容器是一个向量,则可以保证元素是连续分配的,就像在数组中一样,因此指针将起作用.但是,对于a list,指向元素的指针是无用的.它没有给你任何方法来达到下一个元素.


Luc*_*ore 7

因为.end()返回一个迭代器,而不是一个Object,它甚至不是向量的有效成员。

即使使用begin()返回有效对象的 ,您也需要以下内容:

正确的方法是:

std::vector<Object> vec;
std::vector<Object>::iterator it;
//....
it = vec.begin();
Object o = *it;
Run Code Online (Sandbox Code Playgroud)

  • if (it!=vec.end() {o=*it;} (2认同)