如何在向量中保持指针有效,向量指向其他向量中的项

时间:2013-06-01 16:27:39

标签: c++ pointers memory vector

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;
};

向要指向的向量b添加新元素时,它将展开并分配新内存。然后指针向量a将指向坏内存。有没有有效的方法重新指向先前的向量?

a指向几个不同的向量,其顺序很重要。添加新元素时,我希望它保持相同的顺序并最后添加新元素。

2 个答案:

答案 0 :(得分:4)

std::dequevector使用b代替c。它具有与vector(O(1)随机访问等)大部分相同的属性,并且几乎同样有效,push_back从不移动其基础数据。

答案 1 :(得分:3)

我喜欢使用不同标准容器的想法,但也可能值得考虑在向量之间共享对象。这可能代表您正在尝试做得更好,并且可以更容易编程,因为您不必担心指向解除分配/移动内存的指针。 (你需要C ++ 11用于共享指针,或者你可以使用boost)..

#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;
};