STL-setの削除要素
2407 ワード
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のデータ操作
小さな問題
setは赤と黒の木に基づいて実現されていますが、setの反復器begin()、end()はどこを指しているのでしょうか.
テストプログラム:
赤黒ツリーはまず二叉探索ツリーなのでbegin()反復器は赤黒ツリーの一番左のノードを指し,end()反復器は赤黒ツリーの一番右のノードを指す.また、このウィジェットは、重複挿入が無効であることを示しています.
順序削除
1~100の奇数または偶数を削除します.
3の倍数を削除するとエラーが発生します.
正確にはどう書けばいいですか?
理由:STL/C+_でset(コレクション)を削除すると、setのeraseは反復器に戻らないので注意してください.
参考ブログ:http://blog.csdn.net/doctor_feng/article/details/11836137
オリジナルを尊重し、転載は出典を明記してください.http://blog.csdn.net/hurmishine
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