[英]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.