C++ 如何保持指向其他向量中项目的指针在向量中有效 intmain(){ //类B和C继承自A 载体b; 载体c; 载体a; { B_温度; b、 推回(b_温度); C C_温度; c、 推回(c_温度); a、 向后推(&b[0]); a、 推回(&c[0]); b、 push_back(b_temp);//这会打断a,因为它会移动b向量。有没有一种有效的方法来移动指针? //指针向量a的顺序很重要 } 系统(“暂停”); 返回0; };
向指向的向量C++ 如何保持指向其他向量中项目的指针在向量中有效 intmain(){ //类B和C继承自A 载体b; 载体c; 载体a; { B_温度; b、 推回(b_温度); C C_温度; c、 推回(c_温度); a、 向后推(&b[0]); a、 推回(&c[0]); b、 push_back(b_temp);//这会打断a,因为它会移动b向量。有没有一种有效的方法来移动指针? //指针向量a的顺序很重要 } 系统(“暂停”); 返回0; };,c++,pointers,memory,vector,C++,Pointers,Memory,Vector,向指向的向量b添加新元素时,它将扩展并分配新内存。指针向量a将指向坏内存。有没有有效的方法重新指向先前的向量 a指向几个不同的向量,其顺序很重要。添加新元素时,我希望它保持相同的顺序,最后添加新元素。对于b和c使用std::deque而不是vector。它与vector(O(1)随机访问等)具有大多数相同的属性,并且几乎同样有效,push_-back从不移动其底层数据。我喜欢使用不同标准容器的想法,但也可能值得考虑在vector之间共享对象。这可能代表了您正在努力做得更好,并且可能更容易编程,因
b
添加新元素时,它将扩展并分配新内存。指针向量a
将指向坏内存。有没有有效的方法重新指向先前的向量
a
指向几个不同的向量,其顺序很重要。添加新元素时,我希望它保持相同的顺序,最后添加新元素。对于b
和c
使用std::deque
而不是vector
。它与vector
(O(1)随机访问等)具有大多数相同的属性,并且几乎同样有效,push_-back
从不移动其底层数据。我喜欢使用不同标准容器的想法,但也可能值得考虑在vector之间共享对象。这可能代表了您正在努力做得更好,并且可能更容易编程,因为您不需要担心指针进入释放/移动内存的可能性。(共享指针需要C++11,也可以使用boost)
#包括
#包括
内部主(空){
使用std::shared_ptr;
使用std::vector;
载体a;
{
载体b;
载体c;
共享ptr b_temp(新b);
b、 推回(b_温度);
共享c_ptr c_temp(新c);
c、 推回(c_温度);
a、 推回(b[0]);
a、 推回(c[0]);
共享的b_ptr b_temp2(新b);
b、 推回(b_temp2);
}
//a中的两个对象仍然可以在此处使用
返回0;
};
能否将b
和c
改为std::list
?或者,如果元素总数已知,则使用vector::reserve
预分配内存。“从不”是一个很长的时间<代码><当删除不在末尾的元素时,code>deque移动元素。
int main() {
//class B and C inherits from A
vector<B> b;
vector<C> c;
vector<A*> a;
{
B b_temp;
b.push_back(b_temp);
C c_temp;
c.push_back(c_temp);
a.push_back(&b[0]);
a.push_back(&c[0]);
b.push_back(b_temp);//this will break a, since it will move the b vector. is there an efficent way to move the pointers with it?
//pointer vector a's order is important
}
system("PAUSE");
return 0;
};
#include <memory>
#include <vector>
int main(void){
using std::shared_ptr;
using std::vector;
vector<shared_ptr<A>> a;
{
vector<shared_ptr<B>> b;
vector<shared_ptr<C>> c;
shared_ptr<B> b_temp(new B);
b.push_back(b_temp);
shared_ptr<C> c_temp(new C);
c.push_back(c_temp);
a.push_back(b[0]);
a.push_back(c[0]);
shared_ptr<B> b_temp2(new B);
b.push_back(b_temp2);
}
// the two objects in a can still be used here
return 0;
};