0

我有两个指针向量: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

4 回答 4

1

您不应该delete复制您要复制的对象,因为您想保留它temp- 只是erase它来自arr.

于 2012-06-01T22:31:07.150 回答
0

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

++i;

如果你想要第th 元素,你index应该提前iindex

i += index;

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

于 2012-06-01T22:35:27.853 回答
0

据我了解,您想复制指定索引处的元素(参数index)并将其从 vector 中删除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变得无效(悬空指针),因为它指向已经释放的内存。

而且我还建议您使用对象向量而不是指向对象的指针向量 - 尽管元素被复制,但它通常足够快并且没有与之相关的麻烦的内存管理。如果您有充分的理由使用指针向量(何时在 C++ 中使用指针),我建议您改用智能指针向量:如果您支持 TR1 或 C++11,请使用std::shared_ptr,否则使用boost::shared_ptr( shared_ptr 在哪里?

于 2012-06-01T22:35:31.953 回答
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 中删除它们只是 remove-erase 习惯用法的简单应用:

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

可能有一种方法可以将这两个步骤组合成一行,但您可能会失去可读性。

于 2012-06-01T22:47:35.313 回答