簡體   English   中英

將元素從向量復制到另一個

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM