C++底层数据结构常用方法

set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。

平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。

构造set集合主要目的是为了快速检索,不可直接去修改键值。

 

常用操作:

1.元素插入:insert()

2.中序遍历:类似vector遍历(用迭代器)

3.反向遍历:利用反向迭代器reverse_iterator。

    例:

   set s;

   ......

   set::reverse_iterator rit;

   for(rit=s.rbegin();rit!=s.rend();rit++)

4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。

           set s;

           s.erase(2);        //删除键值为2的元素

           s.clear();

5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。

           set s;

           set::iterator it;

           it=s.find(5);    //查找键值为5的元素

           if(it!=s.end())    //找到

                cout<<*it<<endl;

           else            //未找到

                cout<<"未找到";

6.自定义比较函数

   (1)元素不是结构体:

       例:

       //自定义比较函数myComp,重载“()”操作符

       struct myComp

       {

           bool operator()(const your_type &a,const your_type &b)

            [

                return a.data-b.data>0;

           }

       }

       sets;

       ......

       set::iterator it;

   (2)如果元素是结构体,可以直接将比较函数写在结构体内。

       例:

       struct Info

       {

           string name;

           float score;

           //重载“<”操作符,自定义排序规则

           bool operator < (const Info &a) const

           {

                //按score从大到小排列

                return a.score

           }

       }

       set s;

       ......

       set::iterator it;

 

 

 

 

map篇

 

 Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!

1. map最基本的构造函数;

  mapmapstring;         mapmapint;

  mapmapstring;         map< char,string>mapchar;

  mapmapchar;            mapmapint;

2. map添加数据;

  map maplive; 

  1.maplive.insert(pair(102,"aclive"));

  2.maplive.insert(map::value_type(321,"hai"));

   3,maplive[112]="April";//map中最简单最常用的插入添加!

3,map中元素的查找:

  find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。       

  map::iterator l_it;;

  l_it=maplive.find(112);

  if(l_it==maplive.end())

                cout<<"we do notfind 112"<<endl;

  else cout<<"wo find 112"<<endl;

4,map中元素的删除:

   如果删除112;

  map::iterator l_it;;

  l_it=maplive.find(112);

  if(l_it==maplive.end())

       cout<<"we do not find 112"<<endl;

  else  maplive.erase(l_it);  //delete 112;

5,map中 swap的用法:

  Map中的swap不是一个容器中的元素交换,而是两个容器交换;

  Forexample:

 #include

 #include

 using namespace std;

  intmain( )

  {

     map m1, m2, m3;

     map ::iterator m1_Iter;

     m1.insert ( pair   ( 1, 10 ) );

     m1.insert ( pair   ( 2, 20 ) );

     m1.insert ( pair   ( 3, 30 ) );

     m2.insert ( pair   ( 10, 100 ) );

     m2.insert ( pair   ( 20, 200 ) );

     m3.insert ( pair   ( 30, 300 ) );

  cout << "The original map m1 is:";

  for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )

     cout << " " << m1_Iter->second;

     cout   << "."<< endl;

   //This is the member function version of swap

  //m2 is said to be the argument map; m1 the target map

  m1.swap( m2 );

  cout << "After swapping with m2, map m1 is:";

  for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )

     cout << " " << m1_Iter -> second;

     cout  << "."<< endl;

  cout << "After swapping with m2, map m2 is:";

  for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ )

     cout << " " << m1_Iter -> second;

     cout  << "."<< endl;

   //This is the specialized template version of swap

  swap( m1, m3 );

  cout << "After swapping with m3, map m1 is:";

  for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )

     cout << " " << m1_Iter -> second;

     cout   << "."<< endl;

}

6.map的sort问题:

  Map中的元素是自动按key升序排序,所以不能对map用sort函数:

  Forexample:

 #include

 #include

 using namespace std;

 intmain( )

 {

  map m1;

  map ::iterator m1_Iter;

  m1.insert ( pair   ( 1, 20 ) );

  m1.insert ( pair   ( 4, 40 ) );

  m1.insert ( pair   ( 3, 60 ) );

  m1.insert ( pair   ( 2, 50 ) );

  m1.insert ( pair   ( 6, 40 ) );

  m1.insert ( pair   ( 7, 30 ) );

  cout << "The original map m1 is:"<<endl;

  for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )

     cout << m1_Iter->first<<""<<m1_Iter->second<<endl;

 

}

  Theoriginal map m1 is:

  120

  250

  360

  440

  640

  730

  请按任意键继续. . .

7,   map的基本操作函数:

     C++ Maps是一种关联式容器,包含“关键字/值”对

     begin()          返回指向map头部的迭代器

     clear()         删除所有元素

     count()          返回指定元素出现的次数

     empty()          如果map为空则返回true

     end()            返回指向map末尾的迭代器

     equal_range()    返回特殊条目的迭代器对

     erase()          删除一个元素

     find()           查找一个元素

     get_allocator()  返回map的配置器

     insert()         插入元素

     key_comp()       返回比较元素key的函数

     lower_bound()    返回键值>=给定元素的第一个位置

     max_size()       返回可以容纳的最大元素个数

     rbegin()         返回一个指向map尾部的逆向迭代器

     rend()           返回一个指向map头部的逆向迭代器

     size()           返回map中元素的个数

     swap()            交换两个map

     upper_bound()     返回键值>给定元素的第一个位置

     value_comp()      返回比较元素value的函数

posted @ 2015-11-29 16:38  窗外临街  阅读(372)  评论(0编辑  收藏  举报