关于set和map
来源:互联网 发布:vb内缩符号 编辑:程序博客网 时间:2024/05/17 22:49
关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的
数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统
能根据元素的值自动进行排序。set集合容器它的底层是一个红黑树的平衡二叉检索树的
数据结构。
注意:Set、multiset都是集合类,差别在与set中不允许有重复元素(防冗余),multiset中允许有重复元素(可以冗余)。
模版原型:
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()、我们不在此作进一步介绍。
到此结束!
- 关于map 和set
- 关于set和map
- 关于map和set的浅显理解
- 关于set/multiset和map/multimap总结
- 关于set,list,map
- map和set(关于iterator失效的问题)
- STL中关于map和set的四个问题?
- map和set(关于iterator失效的问题)
- STL中关于map和set的四个问题
- 关于List,Set和Map三个接口的特点
- STL中关于map和set的一些问题
- 关于set和map迭代器支持的运算
- 关于Collection(Set,List)和Map接口
- STL中关于map和set的四个问题?
- STL中关于map和set的四个问题?
- Map 和 Set 容器
- map和set异同
- set和map
- 完美扫描PHP特殊一句话后门
- 只用栈与队列实现判断回文
- 计算机科研会议
- pandas数据规整化
- 基于stm32的头追控制 第一视角
- 关于set和map
- gvim的菜单乱码解决方法
- 设计模式随笔-适配器模式
- 9E大帆玩英雄联盟
- 在同一台机器上安装多个版本jdk,修改环境变量不生效
- Python学习10:@perporty
- 【模板】Tarjan
- Java中的XML(写)
- codevs 2833 奇怪的梦境(拓扑排序)