向量,何时重新引用元素 目前为止,我只使用C++中的列表(队列、堆栈、树等)。我读了一些书,并努力学习向量,因为与列表相比,向量更适合遍历,而且在内部管理方面没有数组的复杂性

向量,何时重新引用元素 目前为止,我只使用C++中的列表(队列、堆栈、树等)。我读了一些书,并努力学习向量,因为与列表相比,向量更适合遍历,而且在内部管理方面没有数组的复杂性,c++,vector,data-structures,C++,Vector,Data Structures,到目前为止,我知道在向量需要重新分配的情况下,指针验证可能存在问题。pickle(据我所知)没有真正的方法来确定向向量添加元素是否会触发重新分配 我能想到的一个答案是,每次添加或删除元素时,都将指针重新分配给每个元素 这似乎是一个相当大的开销的机会重新分配完成。也许有更好的方法吗?一种方法是使用指针向量(最好是智能指针,这样您就不必担心手动释放) 例如,代替 std::vector<MyObject> vec; vec.push_back(MyObject()); MyObject*

到目前为止,我知道在向量需要重新分配的情况下,指针验证可能存在问题。pickle(据我所知)没有真正的方法来确定向向量添加元素是否会触发重新分配

我能想到的一个答案是,每次添加或删除元素时,都将指针重新分配给每个元素


这似乎是一个相当大的开销的机会重新分配完成。也许有更好的方法吗?

一种方法是使用指针向量(最好是智能指针,这样您就不必担心手动释放)

例如,代替

std::vector<MyObject> vec;
vec.push_back(MyObject());
MyObject* ptr = &vec[0];
std::向量向量向量机;
向量向后推(MyObject());
MyObject*ptr=&vec[0];
这样做:

std::vector<std::unique_ptr<MyObject>>
vec.push_back(std::unique_ptr<MyObject>(new MyObject()));  // *
MyObject* ptr = vec[0].get();
std::vector vec.push_back(std::unique_ptr(new MyObject());//* MyObject*ptr=vec[0].get(); (*或在C++14中使用
vec.push_-back(std::make_-unique())


如果以第二种方式执行,
ptr
将始终在向量的内部重新分配中有效,因为它不是指向由向量管理的内存,而是指向由unique\u ptr管理的内存,该内存在对象被显式释放或销毁之前不会更改。

“pickle正在执行。”(据我所知)没有真正的方法来确定向向量添加元素是否会触发重新分配。”-有。阅读vector的文档,它会准确地告诉您哪些操作会使指针和迭代器无效。很抱歉,我不是问在重新分配时什么可能会导致无效指针。我是问处理无效指针的方法,以及是否有更好的方法way@userXXX你重新分配所有指针,我在执行使其无效的运算符后使用了畸胎体。其他一切都是UB。谢谢,我想重新分配所有指针和迭代器是一种方法。你是说你总是知道,例如,向向量添加元素是否会导致重新分配并使指针无效?你这样说就像你总是知道是否会发生那样n、 @userXXX不,你不知道重新分配是否总是会发生。你也不需要知道。你只知道文档上说的:指针和迭代器是无效的。怎么做?为什么?无关紧要。而且浪费太多。你看起来像个脾气暴躁的牛角面包。至少他给出了一个符合我要求的答案。@TheParamagneticCroissant浪费了什么?内存?处理器时间(由于多重间接寻址)?是的,这可能会浪费这些东西,但在不了解提问者的用例和了解他或她的程序概况的情况下,你不知道这是否重要。首先以易于编写和维护的方式编写,然后在证明值得担心后再担心性能。@Ty具有一系列对象的LeMMJRY易于编写,易于维护。这不是巧合。存储在STD容器中的对象的惯用方法是直接存储它们。C++具有明确的值语义。问题者显然有一个需要用数值语义来解决的需求。这个场景似乎比在向量中使用智能指针要麻烦得多。