关于set和map

来源:互联网 发布:vb内缩符号 编辑:程序博客网 时间:2024/05/17 22:49


关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的

数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统

能根据元素的值自动进行排序set集合容器它的底层是一个红黑树的平衡二叉检索树的

数据结构。

注意:Set、multiset都是集合类,差别在与set中不允许有重复元素(防冗余),multiset中允许有重复元素(可以冗余)。

模版原型:

 template < class Key, class Compare = less<Key>,
 class Allocator = allocator<Key> > class multiset; 

template < class Key, class Compare = less<Key>,
  class Allocator = allocator<Key> > class multiset;
 



(set)

1.元素插入:insert()

   1.*pair<iterator,bool> insert ( const value_type& x );
在迭代器中插入一个数据,如果不存在,直接插入,返回值为插入后该元素的迭代器和true
如果存在,返回值已存在元素的迭代器和false


  2. iterator insert ( iterator position, const value_type& x );在指定位置插入指定数据


  3.template <class InputIterator>
void insert ( InputIterator first, InputIterator last );
插入一段迭代器*

2.中序遍历:类似vector遍历(用迭代器)
3.反向遍历:利用反向迭代器reverse_iterator
4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。

 1.void erase ( iterator position );
  2.size_type erase ( const key_type& x );
  3.void erase ( iterator first, iterator last );*   

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

6.统计键值key出现的次数:

size_type count ( const key_type& x ) const;

头文件:

#include<iostream>
#include<set>
using namespace std;

应用示例:

void Display(set<int> myset){set<int>::iterator it;for (it=myset.begin(); it!=myset.end(); it++){cout <<*it<<" ";}cout << endl;} void TestSet(){set<int> myset;set<int>::iterator it;pair<set<int>::iterator,bool> ret;//insert的三种应用/*pair<iterator,bool> insert ( const value_type& x );在迭代器中插入一个数据,如果不存在,直接插入,返回值为插入后该元素的迭代器和true如果存在,返回值已存在元素的迭代器和false iterator insert ( iterator position, const value_type& x );在指定位置插入指定数据 template <class InputIterator> void insert ( InputIterator first, InputIterator last );插入一段迭代器*///第一种插入myset.insert(10);myset.insert(20);myset.insert(30);myset.insert(40);myset.insert(50);Display(myset);cout<<endl;ret = myset.insert(20);               if (ret.second==false) {it=ret.first;  }cout<<*it<<endl;//第二种插入myset.insert (it,25);                 myset.insert (it,24);                 myset.insert (it,26);                 Display(myset);cout<<endl;//第三种插入int myints[]= {5,10,15};             myset.insert (myints,myints+3);Display(myset);cout<<endl;           //5 10 15 20 24 25 26 30 40 50//size_type count ( const key_type& x ) const;cout<<"10 count:"<<myset.count(10)<<endl;cout<<"size:"<<myset.size()<<endl;/*void erase ( iterator position );size_type erase ( const key_type& x );void erase ( iterator first, iterator last );*/myset.erase (10);//删除指定数据 10      5 15 20 24 25 26 30 40 50Display(myset);cout<<endl;it=myset.begin();    it++;       //it现在的位置是15                                          myset.erase (it);//指定位置删除         5 20 24 25 26 30 40 50 Display(myset);cout<<endl;it=myset.find (30);myset.erase ( it, myset.end() );//Display(myset);cout<<endl;}


运行结果:



multiset:

multiset和set中很多都是相同的,如Insert(),erase(),find(),count()

在multiset中,如果要插入的key已经存在,那么count+1,并且返回

该迭代器,而count()它的结果不再只是0或1,其他的我们便不多

做介绍,头文件同set

应用实例:

multiset<int> mtset;//      multiset<int>::iterator it;//mtset.insert(50);//mtset.insert(10);//mtset.insert(20);//mtset.insert(30);//mtset.insert(40);//mtset.insert(20);//Display(mtset);//cout<<"10 count:"<<mtset.count(10)<<endl;

运行结果:



map:

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只


能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个


它完成有可能在我们处理一对一数据的时候,这里说下map内部数据的组织,map


内部自建一颗红黑树(一种非严格意义上的平衡二叉树),

特性:

所有元素都会根据元素的键值(key)自动排序

所有元素都是pair,同时拥有键值(key)和实值(value);

pair里边的first被视为键值,second被视为实值。 map不允许两个元素用有相同的键而

mutilmap允许键值重复。


以下是对pair的定义:

template<class K,class V>

struct pair

{

K first;

V second;

};

关于map的一些操作

1.元素插入:insert()

   1.*pair<iterator,bool> insert ( const value_type& x );


在迭代器中插入一个数据,如果不存在,直接插入,返回值为插入后该元素的迭代器和

true,如果不存在,返回值已存在元素的迭代器和false


  2. iterator insert ( iterator position, const value_type& x );在指定位置插入指定数据


  3.template <class InputIterator>
void insert ( InputIterator first, InputIterator last );
插入一段迭代器*

2.中序遍历:类似vector遍历(用迭代器)
3.反向遍历:利用反向迭代器reverse_iterator
4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。
 1.void erase ( iterator position );
  2.size_type erase ( const key_type& x );
  3.void erase ( iterator first, iterator last );*   
 

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

6.统计键值key出现的次数:

size_type count ( const key_type& x ) const;


代码如下:

#include<iostream>#include<map>using namespace std;void Display(map<char,int> mymap){ map<char,int>::iterator it;for ( it=mymap.begin() ; it != mymap.end(); it++ )    {cout << (*it).first << " => " << (*it).second << "  ";}cout<<endl;}void TestMap(){  map<char,int> mymap;  map<char,int>::iterator it;  pair<map<char,int>::iterator,bool> ret;// pair<iterator,bool> insert ( const value_type& x );// iterator insert ( iterator position, const value_type& x );//template <class InputIterator>// void insert ( InputIterator first, InputIterator last );  mymap.insert ( pair<char,int>('a',100) );  mymap.insert ( pair<char,int>('z',200) );  ret=mymap.insert (pair<char,int>('z',500) );   if (ret.second==false)  {   Display(mymap);  }    it=mymap.begin();  mymap.insert (it, pair<char,int>('b',300));  // max efficiency inserting  mymap.insert (it, pair<char,int>('c',400));  // no max efficiency inserting  Display(mymap);  map<char,int> anothermap;  anothermap.insert(mymap.begin(),mymap.find('c'));  Display(anothermap);  cout <<"a count:"<<mymap.count('a')<<endl;  it=mymap.find('b');  mymap.erase (it);                     mymap.erase ('c');                   it=mymap.find ('e');  mymap.erase ( it, mymap.end() );      Display(mymap);}

运行结果:



multimap允许插入相等的key

mutilmap的Insert应用

  multimap<char,int> mymap;  multimap<char,int>::iterator it;  mymap.insert ( pair<char,int>('a',100) );  mymap.insert ( pair<char,int>('z',200) );  mymap.insert ( pair<char,int>('z',200) );  mymap.insert ( pair<char,int>('z',300) );  mymap.insert ( pair<char,int>('c',500) );  mymap.insert ( pair<char,int>('c',400) );  mymap.insert ( pair<char,int>('d',600) );  Display(mymap);  cout <<"c count:"<<mymap.count('c')<<endl;
运行结果:



除此以外map和set还有一些常用的如构造、拷贝构造、析构、operator=、size()、empty()、swap()、clear()、我们不在此作进一步介绍。


                                                               到此结束!

1 0