set&&map
- set (K)
- map(K V)
1、multiset与set的区别就是,multiset允许键值重复,multimap同理;
2、set和map的底层都是用红黑树实现的 ;
在map里存的是一个pair对象
template<class K,class V>
struct pair{
K first; //key
V second; //value
}
map
要注意end返回的是最后一个的下一个,其他的没有什么
insert三个版本
- 插入一个元素
- 特定位置插入
- 插入一个区间
主要看第一个版本
pair<iterator,bool>insert(const value_type& val)
返回一个pair,除了返回一个迭代器外,还返回一个bool值,标志是否插入成功
operator[ ]其实是调用insert实现的
insert&&operator[ ]
void testmap()
{
map<string, size_t> mymap;
//insert
mymap.insert(make_pair("linda", 5));
mymap.insert(make_pair("peter", 6));
mymap.insert(make_pair("xiaoming", 7));
//operator[ ]
mymap["zhangsan"] = 4;
mymap["lisi"] = 8;
//begin、end
map<string, size_t>::iterator it = mymap.begin();
while (it != mymap.end())
{
cout << it->first << ":" << it->second << endl;
it++;
}
}
1、operator[ ]可以修改value的值,但insert不可以
2、value的值必须有必须有默认的拷贝构造
这里size_t类型默认为0,如果是string默认为空字符串
应用:统计字符串字符出现次数
int main()
{
//统计字符串字符出现次数
string s = "abcdabcd";
multiset<char> mymset;
map<char, int> mymap;
for (size_t i = 0; i < s.length(); ++i)
{
mymset.insert(s[i]);
}
int count = 0;
for (size_t i = 0; i < s.length(); ++i)
{
++mymap[s[i]];
}
cout << mymset.count('a')<<endl; //2
cout << mymap['a'] << endl; //2
system("pause");
return 0;
}
multimap::count
// multimap::count
#include <iostream>
#include <map>
using namespace std;
int main ()
{
std::multimap<char,int> mymm;
mymm.insert(make_pair('x',50));
mymm.insert(make_pair('y',100));
mymm.insert(make_pair('y',150));
mymm.insert(make_pair('y',200));
mymm.insert(make_pair('z',250));
mymm.insert(make_pair('z',300));
for (char c='x'; c<='z'; c++)
{
cout << "There are " << mymm.count(c) << " elements with key " << c << ":";
multimap<char,int>::iterator it;
//注意这里的用法
for (it=mymm.equal_range(c).first; it!=mymm.equal_range(c).second; ++it)
cout << ' ' << (*it).second;
cout << '\n';
}
return 0;
}