std :: vectorには、最初の要素から降順で並べ替えられた要素のコレクションがあります。連続したメモリチャンクに要素を含める必要があるため、ベクトルを使用する必要があります。そして、記述された特性を持つベクトルの多くのインスタンスを保持するコレクションがあります(常に降順でソートされます)。
さて、時々、より大きなコレクション(これらのベクトルを保持するもの)に要素が多すぎることがわかった場合、この擬似コードと同様に、これらのベクトルから最小の要素を破棄します。
grand_collection: collection that holds these vectors
T: type argument of my vector
C: the type that is a member of T, that participates in the < comparison (this is what sorts data before they hit any of the vectors).
std::map<C, std::pair<T::const_reverse_iterator, std::vector<T>&>> what_to_delete;
iterate(it = grand_collection.begin() -> grand_collection.end())
{
iterate(vect_rit = it->rbegin() -> it->rend())
{
// ...
what_to_delete <- (vect_rit->C, pair(vect_rit, *it))
if (what_to_delete.size() > threshold)
what_to_delete.erase(what_to_delete.begin());
// ...
}
}
このコードを実行した後、what_to_delete
これらのベクトルから削除したい元のベクトル(全体として最小の値)を指すイテレーターのコレクションがあります。元のベクトルは、このコードにヒットする前にソートされることを忘れないでください。つまりwhat_to_delete[0 - n]
、位置上のイテレータが、同じベクトルの先頭から、、であるよりも遠い要素を指す方法はありませn - m
ん。n
m > 0
元のベクトルから要素を消去するときは、reverse_iteratorをiteratorに変換する必要があります。これを行うために、私はC++11の§24.4.1/1に依存しています。
reverse_iteratorとイテレータの関係は&*(reverse_iterator(i))==&*(i-1)です。
つまり、を削除するvect_rit
には、次を使用します。
vector.erase(--vect_rit.base());
現在、C ++ 11標準によると§23.3.6.5/3
:
イテレータerase(const_iterator position); 効果:消去の時点以降のイテレータと参照を無効にします。
これはreverse_iteratorsでどのように機能しますか?reverse_iteratorsは、ベクトルの実際の始まり(vector[0]
)を参照して内部的に実装され、そのvect_ritを従来のイテレーターに変換してから消去しても安全ですか?または、reverse_iteratorはrbegin()(これはvector[vector.size()]
)を参照ポイントとして使用し、ベクトルの0インデックスから離れたものを削除しても、逆イテレーターは無効になりますか?
編集:
reverse_iteratorはrbegin()を参照ポイントとして使用しているようです。私が説明した方法で要素を消去すると、最初の要素が削除された後、差分不可能なイテレータに関するエラーが発生しました。const_iterator
一方、挿入中に従来のイテレータ(に変換)を保存すると、what_to_delete
正しく機能しました。
さて、将来の参照のために、標準はランダムアクセスreverse_iteratorの場合に参照ポイントとして扱われるべきものを指定していますか?または、これは実装の詳細ですか?
ありがとう!