从vector <pointer *>复制到C ++ </pointer *> </pointer *>中的vector <pointer *>

时间:2013-05-10 04:08:06

标签: c++ stdvector

我创建了一个向量A并希望使用下面的方法复制到另一个类中的向量B,这是正确的方法吗?矢量A可能会被破坏!我在谷歌搜索,但没有找到好的解决方案和有意义的解释。谢谢大家

void  StateInit(vector<CButton*> listBtn) 
{ 
   _m_pListBtn = listBtn; 
 };

2 个答案:

答案 0 :(得分:5)

是和否,您按值传递矢量:

void  StateInit(vector<CButton*> listBtn) 
{ 
   _m_pListBtn = listBtn; 
 };

这意味着listBtn是向量A的副本(假设我们正在调用向量A作为StateInit的参数传递),如果删除向量A,向量B仍将具有指针集合,它们将有效,因为指针向量的销毁不会删除指向的对象,因为它现在不可能(它应该调用,删除,删除[],免费?)。

请记住,如果修改/删除向量A中的一个元素(使用向量上的指针),该元素将在向量B中修改(因为它是指向同一元素的指针)。

我不确定你对此有什么打算,但是如果要复制整个向量,你应该为对象实现一个克隆机制,然后使用transform复制它们:

class cloneFunctor {
public:
    T* operator() (T* a) {
        return a->clone();
    }
}

然后只是:

void  StateInit(vector<CButton*> listBtn) 
{ 
   transform(listBtn.begin(), listBtn.end(), back_inserter(_m_pListBtn), cloneFunctor()); 
 };

如果您的意图不是克隆它而是分享指针,您应该将向量作为指针或引用传递:

void StateInit(const vector<CButton*>& listBtn) 
{ 
   _m_pListBtn = listBtn; 
};

答案 1 :(得分:-2)

更好的方法是迭代新的向量并将push_back元素迭代到向量。

请参阅示例代码:std::vector::begin