【发布时间】:2014-10-25 02:48:28
【问题描述】:
我们都知道vector<T> 中元素的地址可能会随着我们追加更多元素(由于调整大小)而改变,而list<T> 中的元素保持在同一地址。
问题是,vector<list<T>> 呢?例如,
vector<list<T>> container;
// Insert some elements to container...
T* ptr = &(container[0].back());
// Insert more elements to container...
我们可以假设ptr 保持有效吗?
天真地,我认为它应该,因为当向量调整大小时,它应该调用list<T> 的移动构造函数,它不应该复制/移动单个元素。但是,我不知道标准是否能确保这一点。
【问题讨论】:
-
列表中的元素应该是安全的,因为它应该移动。我说应该,因为我昨天在 VC++ 中发现了一个错误,移动在不应该的地方失败。我会说测试以确保。这很容易。存储一个指针。然后继续添加到向量以强制重定位。比较
.data()指针。当向量移动时,将指针地址与同一元素进行比较。 -
有一些恼人的标准缺陷,与您的情况不完全相关,例如see here.
-
谢谢,@KerrekSB,根据 dyp 在您的链接中的回答,似乎 C++ 标准有一个名为 LWG 2321 的提案,它将明确回答我的问题为“是”。所以我猜 current (C++11) 标准还不能完全确保它。
-
@jick 它还没有回答你的问题:它还要求
vector不复制它的任何元素。如果它在重新分配时复制元素,则对list的移动构造函数的任何保证都不适用,因为将调用list的复制构造函数。vector不应该复制它的元素,但我不知道标准是否真的说它没有。 (无论如何,我找不到它。)