2017-04-12 88 views
0

簡單問題:是否有任何STL容器允許我在常量時間內刪除當前迭代器的位置?
在此先感謝!stl容器中的常量移除元素

+0

'std :: list' http://en.cppreference.com/w/cpp/container/list/erase – Raxvan

+3

注意:如果您支持其他操作,請考慮(測量)'vector'。雙鏈表有很多開銷 –

+4

值得注意的是,任何非排序的容器都可以在任何位置使用容器末尾(或開始處)的元素交換元素,然後刪除最後一個/第一個元素。這允許在恆定時間內進行刪除,只要交換容器的value_type可以在不變的時間內完成。此技術已在[本次發言中](https://youtu.be/oBbGC-sUYVA?t=155)在CppCon 2016 – Pandatyr

回答

2

std::list具有erase與複雜性:

複雜

1)的常數。

2)線性在第一個和最後一個之間的距離。

其中,對於情況2,您使用擦除元素的範圍。

從文檔,std::list<T>::erase看起來是這樣的:

//(1) 
iterator erase(iterator pos); 
iterator erase(const_iterator pos); 
//(2) 
iterator erase(iterator first, iterator last); 
iterator erase(const_iterator first, const_iterator last); 

另一個是std::forward_list(不完全一樣的,因爲它只有erase_after

2

至少std :: list允許在一段時間內擦除元素。

1

如果您不需要維持秩序您可以使用std::vector的元素以及「交換和彈出」 - 您將要刪除的元素與矢量中的最後一個元素交換,然後彈出新的最後一個元素。