[英]copying elements from vector to another one
我有两个指针向量: 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();
}
您不应该delete
要复制的对象,因为您希望将其保持在temp
-只需将其从arr
erase
。
arr.begin()
为您提供了一个指向第一个元素的迭代器,因此,如果您想要第二个元素,则应将i
提前一个:
++i;
如果想要第index
个元素,则应按index
向前移动i
:
i += index;
将原始指针存储在向量中,并且从向量中删除它们时必须记住要删除它们,这是等待发生的内存泄漏。 在另一个答案中提到了molbdnilo屁股,您实际上有一个内存处理错误,因为您正在删除temp有指针的对象。
据我了解,您想复制指定索引处的元素(参数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
的指针将变为无效( 悬空指针 ),因为它指向已释放的内存。
而且我还建议您使用对象向量而不是对象指针向量-尽管元素被复制,但通常速度足够快,并且与此相关的内存管理也没有麻烦。 如果有充分的理由为什么要使用指针向量( 在C ++中何时使用指针 ),我建议您改用智能指针向量:如果您支持TR1或C ++ 11,请使用std::shared_ptr
,否则使用boost::shared_ptr
( boost::shared_ptr
在哪里? )
这看起来像工作!
我会做这样的事情:
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());
可能有一种方法可以将这两个步骤合并为一行,但是您冒着失去可读性的风险。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.