提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
C++ set,map,multimap,multiset,unordered 总结
1、pair
pair对象是一个键值对
头文件:不需要头文件
定义 :
pair<int,int> p;
pair<string,string> p1;
pair<string, vector<int> > line;
pair<string, string> author("James", "Joyce");
p2=make_pair("James", "Joyce");
用法:
pair<string, string> p("James", "Joyce");
string one=p.first;
string two=p.second;
2、map
map代表一个映射,是键值对的集合,每个键和值的类型分别相同,键不能重复,值可重复
头文件:
#include<map>
定义 :
map<string, int> m1;
map<string, int> m2(m1);//拷贝m1
map<string, int>::key_type;//键对应的类型,string
map<string, int>::mapped_type;//值对应的类型,int
map<string, int>::value_type;//pair<string,int>
用法:
1、访问元素
m1["anna"]=1;
m1["bob"];//值初始化为0
如果有"anna"的键,将其值设为1,如果没有,添加一个<"anna",1>键值对
2、插入元素
pair<string,int> p("anna",1);
m.insert(p);//插入操作插入的是pair类型
m.insert(make_pair("anna",1));//常用写法
3、查找元素
int num=m.count("anna");//计数,查找"anna"出现的次数,对于map,如果存在则为1,不存在为0
int occurs = 0;
map<string,int>::iterator it = m.find("foobar");//find返回迭代器
if (it != m.end())
occurs = it->second;
4、删除元素
m.erase("anna");
map<string,int>::iterator iter = m.find("anna");//用迭代器删除
m.erase(iter);
5、迭代器
map<string,int>::iterator iter = m.begin();
while (iter != m.end()) {
cout << iter->first << endl
<< iter->second << endl;
++iter; // increment iterator to denote the next element
}
6、求大小
int m_size=m.size();
3、set
set代表一个集合,每个元素类型相同,不可重复
头文件:
#include<set>
定义 :
set<string> s;
set<string> s1(s);//拷贝s
vector<int>vec = {1,2,3,4};
set<int> iset(vec.begin(), vec.end());//利用vector容器初始化
用法:
1、插入元素
s.insert("anna");
iset.insert(vec.begin(), vec.end());//用vector批量插入
2、查找元素
int num = s.count("anna");//计数,查找"anna"出现的次数,对于set,如果存在则为1,不存在为0
set<string>::iterator it = s.find("anna");
if (it != s.end())
cout<<*it<<endl;//迭代器代表的类型并不是pair,所以用*取值
3、删除元素
s.erase("anna");//如果不存在也不会报错
set<string>::iterator it = s.find("anna");
s.erase(it);//使用迭代器删除
4、迭代器
set<string>::iterator iter = s.begin();
while (iter != s.end()) {
cout << *iter<< endl;
++iter; // increment iterator to denote the next element
}
5、求大小
int s_size=s.size();
4、multimap
multimap代表一个映射,是键值对的集合,每个键和值的类型分别相同,键、值可重复,键相同的元素位置相邻
头文件:
#include<map>//只需要map的头文件就可以了
定义 :
multimap<string, string> mm;
multimap<string, string> mm1(mm);
用法:
1、插入元素
mm.insert(make_pair(string("Barth, John"),string("Lost in the Funhouse")));
2、查找元素
int num=mm.count("anna");//元素个数可能大于1
multimap<string,string>::iterator it =mm.find("anna");
for(int i=0;i<num;i++){
cout<<it->second<<endl;//使用count和find操作配合进行查找
it++;
}
3、删除元素
int erase_num = mm.erase("anna");//删除anna的所有键值对,返回删除的元素个数
multimap<string, string>::iterator it=mm.find("anna");
mm.erase(it);//删除迭代器指向的第一个键值对
4、迭代器
mm.lower_bound(key);//返回一个迭代器,指向键不小于 k 的第一个元素
mm.upper_bound(key);//返回一个迭代器,指向键大于 k 的第一个元素
mm.equal_range(key);//返回一个迭代器的 pair 对象,它的 first 成员等价于 m.lower_bound(k),second 成员则等价于 m.upper_bound(k)
(1)查找相同元素的迭代器1
multimap<string, string>::iterator iter_low=mm.lower_bound("anna");
multimap<string, string>::iterator iter_up=mm.upper_bound("anna");
while(iter_low!=iter_up)
{
cout<<iter_low->second<<endl;
iter_low++;
}
(2)查找相同元素的迭代器2
typedef multimap<string, string>::iterator it;//使用typedef简化程序
pair<it, it>pos = mm.equal_range("anna");
while (pos.first != pos.second) {
cout << pos.first->second << endl; // print each title
++pos.first;
}
(3)整个multimap的迭代器
multimap<string, string><string,int>::iterator iter = mm.begin();
while (iter != mm.end()) {
cout << iter->first << endl
<< iter->second << endl;
++iter; // increment iterator to denote the next element
}
5、求大小
int m_size=mm.size();
5、multiset
multiset代表一个集合,每个元素类型相同,可重复,相同的元素位置相邻
头文件:
#include<set>
定义 :
multiset<string> s;
multiset<string> s1(s);//拷贝s
vector<int>vec = {1,2,3,4};
multiset<int> iset(vec.begin(), vec.end());//利用vector容器初始化,vector中重复元素也会进入iset
用法:
1、插入元素
s.insert("anna");
iset.insert(vec.begin(), vec.end());//用vector批量插入
2、查找元素
int num = s.count("anna");//计数,查找"anna"出现的次数,可以大于1
multiset<string,string>::iterator it =s.find("anna");
for(int i=0;i<num;i++){//使用count和find操作配合进行查找
cout<<*it<<endl;//迭代器代表的类型并不是pair,所以用*取值
it++;
}
3、删除元素
int erase_num = s.erase("anna");//删除所有anna元素,返回删除的个数
multiset<string>::iterator it = s.find("anna");
s.erase(it);//使用迭代器删除
4、迭代器
s.lower_bound(key);//返回一个迭代器,指向不小于 k 的第一个元素
s.upper_bound(key);//返回一个迭代器,指向大于 k 的第一个元素
s.equal_range(key);//返回一个迭代器的 pair 对象,它的 first 成员等价于 s.lower_bound(k),second 成员则等价于 s.upper_bound(k)
(1)查找相同元素的迭代器1
multiset<string>::iterator iter_low=s.lower_bound("anna");
multiset<string>::iterator iter_up=s.upper_bound("anna");
while(iter_low!=iter_up)
{
cout<<*iter_low<<endl;
iter_low++;
}
(2)查找相同元素的迭代器2
typedef multiset<string>::iterator it;//使用typedef简化程序
pair<it, it>pos = s.equal_range("anna");
while (pos.first != pos.second) {
cout << *pos << endl; // print each title
++pos.first;
}
(3)整个multiset迭代器
multiset<string>::iterator iter = s.begin();
while (iter != s.end()) {
cout << *iter<< endl;
++iter; // increment iterator to denote the next element
}
5、求大小
int s_size=s.size();
6、unordered_map,unordered_set,unordered_multiset,unordered_multimap
C++11标准定义的4个无序容器,使用哈希函数来组织元素,
头文件:
#include<unordered_map>,#include<unordered_set>
定义 :
定义与对应的类型相同
用法:
用法相同,在multimap,multiset中,相同键和相同元素依然近邻存放。