将元素从向量复制到另一个

时间:2012-06-01 22:17:40

标签: c++ stl vector

我有两个指针向量:arr已包含一些元素和temp,我想要将特定元素从arr复制到的新向量。例如,我想将arr的第二个元素复制到temp并从arr中删除。怎么办呢?

我试过了,但这不好:

void deleteobject(vector < figure3d *> &arr,int index,vector < figure3d *> &temp)
{
     vector < figure3d * > :: iterator i=arr.begin();
     temp.insert(temp.begin(),*i);
     delete *i;
     arr.erase(i);
     temp[0]->print();
}

4 个答案:

答案 0 :(得分:1)

您不应该delete要复制的对象,因为您希望将其保留在temp中 - 只需erase来自arr

答案 1 :(得分:0)

arr.begin()给你一个指向第一个元素的迭代器,所以如果你想要第二个元素,你应该提前i一个:

++i;

如果你想要index元素,你应该i前进index

i += index;

将原始指针存储在向量中,并且必须记住在从向量中删除它们时删除它们是等待发生的内存泄漏。在另一个答案中提到了ass molbdnilo,你实际上有一个内存处理错误,因为你正在删除temp有指针的对象。

答案 2 :(得分:0)

根据我的理解,您希望复制指定索引处的元素(参数index)并将其从矢量temp中删除。这个函数看起来很简单:

void deleteobject(std::vector<figure3d*> &arr, int index, std::vector<figure3d*> &temp)
{
    temp.insert(temp.begin(), arr[index]);
    arr.erase(arr.begin() + index);
}

在这种情况下,您不复制对象本身,而只复制对它的引用 - 因此您不需要释放存储此对象的内存。

另请注意,在您的函数中,您调用delete *i;来释放存储i指向的对象的内存 - 并且存储在arr中的指针变为无效(悬空指针),因为它指向已经释放的内存。

我还建议您使用对象向量而不是指向对象的向量 - 虽然元素被复制,但它通常足够快并且没有与之相关的麻烦的内存管理。如果你有充分的理由使用指针向量(When to use pointers in C++), 我建议您使用智能指针向量:如果您有TR1或C ++ 11支持,请使用std::shared_ptr,否则使用boost::shared_ptrWhere is shared_ptr?

答案 3 :(得分:0)

这看起来像是一份工作! 这样的事情就是我要做的事情:

Class removePredicate{
Public: 
    bool operator() (figure3d** item) {
       //remove logic goes here
    }
};

remove_copy_if(arr.begin(), arr.end(), back_inserter(tmp), not1(removePredicate));

这会将要删除的所有元素复制到tmp中。实际上将它们从arr中移除它只是一个简单的删除擦除习惯用法:

erase(remove_if(arr.begin(), arr.end(), not1(removePredicate)), arr.end());

可能有一种方法可以将这两个步骤合并为一行,但是您可能会失去可读性的风险。