如果我有一个对象向量(普通对象,而不是指针或引用),为什么我不能这样做?
Object* object;
object = vectorOfObjects.end();
或
object = &vectorOfObjects.end();
或
object = &(*vectorOfObjects.end());
同样的问题,如果'object'是一个参考。
答案 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,它本身就是一个对象,而不是一个内存地址。