STL標準では、std :: deque、std :: listなどのコンテナで消去が発生すると、イテレータが無効になると定義されています。
私の質問は次のとおりです。std::dequeに含まれる整数のリストと、std :: dequeの要素の範囲を示すインデックスのペアを想定すると、すべての偶数要素を削除する正しい方法は何ですか?
これまでのところ、次のことがありますが、ここでの問題は、消去後に想定される終了が無効になることです。
#include <cstddef>
#include <deque>
int main()
{
std::deque<int> deq;
for (int i = 0; i < 100; deq.push_back(i++));
// range, 11th to 51st element
std::pair<std::size_t,std::size_t> r(10,50);
std::deque<int>::iterator it = deq.begin() + r.first;
std::deque<int>::iterator end = deq.begin() + r.second;
while (it != end)
{
if (*it % 2 == 0)
{
it = deq.erase(it);
}
else
++it;
}
return 0;
}
std :: remove_ifがどのように実装されているかを調べると、非常にコストのかかるコピー/シフトダウンプロセスが進行しているようです。
すべてのコピー/シフトなしで上記を達成するためのより効率的な方法はありますか?
一般に、要素を削除/消去することは、シーケンス内の次のn番目の値と交換するよりもコストがかかります(nはこれまでに削除/削除された要素の数です)
注:回答では、シーケンスサイズが非常に大きく、+ 1mil要素であり、平均して要素の1/3が消去可能であると想定する必要があります。