STL-setの削除要素


setの概要はvector,listと異なりset,mapはいずれも関連式コンテナである.set内部は赤黒樹に基づいて実現される.挿入と削除は、データの移動を行わずに関連ポインタを変更するだけで効率的です.データ削除操作を行った後、反復器は無効になりますか?setのデータを削除する場合、実際の操作は赤黒ツリーのノードを削除し、関連ポインタを調整します.他の要素を指す反復器が元の位置を指すかは変わりませんので、ノードを削除しても他の反復器は無効になりません.リストとmapも同じ理屈です.しかしvectorの要素を削除すると、vectorの他の反復器は無効になります.vectorは配列に基づいているため、要素を削除すると、後ろの要素が前に移動するため、後ろの要素を指す反復器は無効になります.反復器の実現についてもう少しお話しします.反復器はオブジェクトであり、vectorの反復器は配列の下付きをカプセル化している.List,map,setの反復器は要素ノードをカプセル化したポインタである.もう一つ、数学の面から、setの集合は、袋の中に小さなボールがたくさん入っているようなものです.しかし、赤黒ツリーは特殊な二叉探索ツリーであり、setの要素はその値の大きさに応じて赤黒ツリーに特定の位置があり、移動できない.したがって,1はsearch操作効率が高いO(log n),2はset中の要素の値は変えられない.
setのデータ操作
::begin()      //   
::end()      //   
::clear()     //  set         
::empty()    //  set      
::max_size()  //  set             
::size()    //    set        
::rbegin   //    
::rend()  //    

小さな問題
setは赤と黒の木に基づいて実現されていますが、setの反復器begin()、end()はどこを指しているのでしょうか. 
テストプログラム:
#include
#include
using namespace std;
int main()
{
    set myset;
    myset.insert(4);
    myset.insert(7);
    myset.insert(2);
    myset.insert(0);
    myset.insert(4);
    set::iterator it;
    for(it = myset.begin(); it != myset.end(); it++)
    {
        cout<< *it;   //     :0247
    }
}

赤黒ツリーはまず二叉探索ツリーなのでbegin()反復器は赤黒ツリーの一番左のノードを指し,end()反復器は赤黒ツリーの一番右のノードを指す.また、このウィジェットは、重複挿入が無効であることを示しています.
順序削除
1~100の奇数または偶数を削除します.
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
    sets;
    for(int i=100; i; i--)
        s.insert(i);
    set::iterator it;
    for (it=s.begin(); it!=s.end(); it++)
    {
        cout<
この操作は正しい結果を得ることができますが、方法は正しいですか?
3の倍数を削除するとエラーが発生します.
正確にはどう書けばいいですか?
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
    sets;
    for(int i=100; i; i--)
        s.insert(i);
    set::iterator it;
    for (it=s.begin(); it!=s.end(); it++)
    {
        cout<

理由:STL/C+_でset(コレクション)を削除すると、setのeraseは反復器に戻らないので注意してください.
参考ブログ:http://blog.csdn.net/doctor_feng/article/details/11836137
オリジナルを尊重し、転載は出典を明記してください.http://blog.csdn.net/hurmishine