次のような unordered_set があります。
unordered_set <long> valueSet;
/*the following insertion is done in order (from 1 to 10000),
*unordered_set will keep the elements based on the insertion order, right,
*just like in a vector ?
**/
for(long i = 1; i <= 10000;++i)
{
valueSet->insert(i);
}
次に、その unordered_set 内の要素の約 85% を消去する別の関数を実行しました。(消去される要素は、この関数のロジックに依存しますが、すべての要素が最初に順番に挿入されたので問題ではありません)。
unordered_set のいくつかの要素を消去した後、その unordered_set にまだ残っている最後の要素を出力したいと思います。たとえば、要素 9997、9998、9999、および 10000 が消去されているため、このセットに残っている最大の要素は 9996 です。これを行う方法は?
基本セットを使用する場合、次のことができます。
set <long>::reverse_iterator it = valueSet.rbegin();
cout << *it << endl;
セットにはreverse_iteratorとrbegin()がありますが、これはunordered_setには存在しません。基本セットを作成しなかった理由は、要素サイズを 10^8 まで拡大する必要があるためです。通常のセット (赤黒木に基づく) を使用すると、実際にパフォーマンスが低下します (特に、挿入と削除を扱う場合)。これどうやってするの?最終的に残った unordered_set をベクターにコピーすることはできますが、もちろん時間がかかります。よりスマートな方法を使用してこれを達成するにはどうすればよいですか? 次のようなこともできないことに気付きました:
unordered_set <long>::iterator it = valueSet.end();
//operator -- does not exist here in the unordered_set
it--;