vector<list<T>> 是否保证元素地址保持不变?



我们都知道,当我们添加更多元素时(由于调整大小),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>的移动构造函数,而不应该复制/移动单个元素。然而,我不知道标准是否能确保这一点。

抱歉,没有。std::list的移动构造函数不是noexceptstd::vector在调整大小时使用了std::move_if_noexcept,这将是包含的std::list s的副本。所有列表节点都将被分配和复制。他们的地址将不稳定。

您可能应该将其设为vector<list<T>*>,而不是vector<list<T>>。使用vector<list<T>*>,可以确定所包含的指针不会被更改(并且不会有任何内部列表的重拷贝),因为它们是向量的值,并且向量的值不会被扩展逻辑更改。这比依靠复制内部列表只移动head元素而不重新分配任何剩余节点要安全得多(这也更容易理解)。用另一种方式做这件事很难理解,而且只是在玩火。

最新更新