[英]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::move
) std::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::move
在vector
某個元素上(或通常在其他標准容器中)移動之后,是否會出現諸如雙重破壞這些元素的問題?
2)是否有標准方法可以有效地進行此類過濾?
防止移動引起的問題不是集裝箱的責任。 只要所移動項目的類型具有定義正確的正確的move構造函數/隱式move構造函數,則將這些項目從items
移動到new_items
的方式與任何其他move操作相同; 容器不會改變這一點。
簡而言之,這種責任在於類,而不是它所使用的容器。
從中移出的對象處於有效但未指定的狀態,並且可以在沒有前提條件的情況下調用它們。 析構函數必須是沒有先決條件的函數。 如果SomeType
此條件,則其SomeType
。
因此,不會有雙重破壞的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.