2013-03-18 66 views
2
std::list<Value> stdList; 

stdList.push_back(Value()); 

Value * ptr = &stdList.back(); // <-- what will this address point to? 

如果我参加由back()返回的引用和隐式转换到少通用Value *,将其指向列表的最后一个值之间的转换,还是会指向某个地方意外?指针和引用

有没有办法从一个指针创建一个迭代器,用于std :: list函数,如erase()?我认识到通用指针(指向指针的迭代器)远比其他方向更可行,但我认为我会问。

+0

请注意,'stdList.back()'不返回迭代器,它返回对元素的引用。你在想'stdList.rbegin()'吗? – Xymostech 2013-03-18 02:09:24

+0

@Xymostech - 哦,我的错误。我稍后问了另一个问题,其中一位评论者将返回值描述为迭代器。所以我想我只是下意识地把它挑起来了。我会解决这个问题 – 2013-03-18 02:18:01

回答

2

指针将指向存储在容器内的值。参考做了同样的事情。

您不能直接将该指针转换为列表迭代器,因为您已经丢失了有关周围结构的所有信息。要做到这一点,你必须巧妙地与list::find

你正在尝试做什么有时使用vector完成。您可以将vector数据元素指针变为迭代器(数组索引)的原因是因为您知道vector的结构。

请注意list::back()确实不是返回一个迭代器。它返回一个参考。这两者完全不同。你在想关于list::end()?还是你真的在迭代器和引用之间混淆?因为你可以从得到一个指针的引用。你这样做:

Value& refval = *ptr; 
1

是的,指针指向存储在列表中的最后一个值。

我们不能从指针创建迭代器,迭代器是容器的概念(此处列表),迭代器不关心列表中存储的是什么类型的值。 引用和指针是存储在列表中的值的句柄,它们是可互换的,我们可以将引用转换为指针,反之亦然。