0
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指向几个不同的向量,它的顺序很重要。添加新元素时,我希望它保持相同的顺序并最后添加新元素。

4

2 回答 2

4

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

于 2013-06-01T16:34:46.967 回答
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;
};
于 2013-06-01T16:50:34.440 回答