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

时间:2012-02-04 13:10:10

标签: c++ iterator

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

Object* object;

object = vectorOfObjects.end();

object = &vectorOfObjects.end();

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

同样的问题,如果'object'是一个参考。

4 个答案:

答案 0 :(得分:11)

它们是三个独立的错误:

object = vectorOfObjects.end();

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

object = &vectorOfObjects.end();

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

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

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

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

答案 1 :(得分:3)

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

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

正确的方法是:

std::vector<Object> vec;
std::vector<Object>::iterator it;
//....
it = vec.begin();
Object o = *it;

答案 2 :(得分:2)

这是因为按惯例end没有指向容器中的有效位置:它位于容器末尾的位置,因此取消引用它是非法的。

begin()的情况不同:您可以在v.begin() != v.end()时取消引用它(即当容器不为空时):

object = *vectorOfObjects.begin();

如果您需要访问最后一个元素,可以执行以下操作:

vector<object>::const_iterator i = vectorOfObjects.end();
i--;
cout << *i << endl; // Prints the last element of the container

同样,仅当您的向量包含至少一个元素时,此方法才有效。

答案 3 :(得分:-1)

Object *表示指向Object的指针,其中指针是内存地址。但.end()方法返回一个Iterator,它本身就是一个对象,而不是一个内存地址。