簡體   English   中英

從標准容器中移動元素是否合法?

[英]Is it legal to move elements from standard containers?

我正在編寫一個類,該類需要用於過濾成員容器的高效函數(讓我們說std::vector )。 此功能應具有類似於以下內容的界面:

void filter(std::vector<SomeType>& items, const std::vector<int>& inds);

該函數應使容器items處於以下狀態:-應該刪除inds索引所指向的項目-其他項目應保留在容器中並保持初始順序。

為了簡單起見,假設inds是在每個操作上都具有O(1)的理想容器,並且所有索引均有效且沒有重復。

我的想法是創建第二個容器,保留所需的空間,然后將所有未被inds索引的元素(通過std::movestd::move到該新容器中; 然后只需交換舊容器和新容器即可。

例如這樣:

void filter(std::vector<SomeType>& items, const std::vector<int>& inds)
{
    std::vector<SomeType> new_items{};
    new_items.reserve( items.size() - inds.size() );

    for(size_t i = 0; i < items.size(); ++i)
        if( contains( inds, i ) ) // magic O(1) function, never mind
            new_items.push_back( std::move( items[i] ) );

    items.swap(new_items);
}

我的問題是:

1)在使用std::movevector某個元素上(或通常在其他標准容器中)移動之后,是否會出現諸如雙重破壞這些元素的問題?

2)是否有標准方法可以有效地進行此類過濾?

防止移動引起的問題不是集裝箱的責任。 只要所移動項目的類型具有定義正確的正確的move構造函數/隱式move構造函數,則將這些項目從items移動到new_items的方式與任何其他move操作相同; 容器不會改變這一點。

簡而言之,這種責任在於類,而不是它所使用的容器。

從中移出的對象處於有效但未指定的狀態,並且可以在沒有前提條件的情況下調用它們。 析構函數必須是沒有先決條件的函數。 如果SomeType此條件,則其SomeType

因此,不會有雙重破壞的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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