1、map为关联容器,其元素以键值对的形式存放
map对象的定义:
map<k,v> m; 创建一个名为m的空map对象
map<k,v> m(m2); 创建m2的副本m
使用下标访问map和使用下标访问vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。
3、map插入元素
m.insert(e) e是一个用在m上的value_type类型的值。如果e不在m中,则插入;如果e存在,则保持m不变。返回一个pair对象,包含一个指向键的map迭代器和bool值,表示是否插入了该元素。
m.insert(b,e) 对于该范围内的所有元素,只有当它的键在m中不存在时,才插入。返回void
m.insert(iter,e) 以iter为起点搜索新元素存储的位置,返回一个迭代器,指向m中具有给定键的元素。
4、查找并读取map中的元素
m.count(k) 返回m中k的出现次数
m.find(k) 如果存在,返回指向该元素的迭代器,否则,返回超出末端的迭代器,即.end();
5、map元素的删除
erase(k) 删除指定键的元素,返回size_type,表示删除元素的个数。 0 or 1
erase(p) 删除迭代器所指向的元素,返回void
erase(b,e)
6、multimap
map对象的定义:
map<k,v> m; 创建一个名为m的空map对象
map<k,v> m(m2); 创建m2的副本m
map<k,v> m(b,e); 存储迭代器b至e范围内的所有副本,该元素类型必须能转换为pair<const key,value>形式
使用下标访问map和使用下标访问vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。
/**
* 计算读入的每个单词的个数
*/
int main(int argc,char **argv)
{
string words;
map<string,int> word_count;
while(cin>>words){
if(words == "c"){ //输入c则退出循环
break;
}
++word_count[words];//第一次出现则往map容器中添加新元素,同时将其值初始化为0,然后其值立即加1
}
map<string,int>::iterator map_iter = word_count.begin(); //开始迭代输出
while(map_iter != word_count.end()){
cout<<map_iter->first<<" "<<map_iter->second<<endl;
map_iter++;
}
return 0;
}
3、map插入元素
m.insert(e) e是一个用在m上的value_type类型的值。如果e不在m中,则插入;如果e存在,则保持m不变。返回一个pair对象,包含一个指向键的map迭代器和bool值,表示是否插入了该元素。
m.insert(b,e) 对于该范围内的所有元素,只有当它的键在m中不存在时,才插入。返回void
m.insert(iter,e) 以iter为起点搜索新元素存储的位置,返回一个迭代器,指向m中具有给定键的元素。
/**
* 计算读入的每个单词的个数,使用insert成员可以带来不必要的初始化
*/
int main(int argc,char **argv)
{
string words;
map<string,int> word_count;
typedef map<string,int>::value_type valType;
while(cin>>words){
if(words == "c"){ //输入c则退出循环
break;
}
pair<map<string,int>::iterator, bool> ret = word_count.insert(valType(words,1));//对于每个单词都尝试insert,并将初值赋为1
if(!ret.second){//如果没有插入成功,说明单词已经存在了
ret.first->second++;//返回的迭代器执行给定键的元素(无论是否插入)
}
}
map<string,int>::iterator map_iter = word_count.begin(); //开始迭代输出
while(map_iter != word_count.end()){
cout<<map_iter->first<<" "<<map_iter->second<<endl;
map_iter++;
}
return 0;
}
4、查找并读取map中的元素
m.count(k) 返回m中k的出现次数
m.find(k) 如果存在,返回指向该元素的迭代器,否则,返回超出末端的迭代器,即.end();
5、map元素的删除
erase(k) 删除指定键的元素,返回size_type,表示删除元素的个数。 0 or 1
erase(p) 删除迭代器所指向的元素,返回void
erase(b,e)
6、multimap
string i_to_s(int i)
{
char buf[10];
sprintf(buf,"%d",i);
string s=buf;
return s;
}
string i_to_s_2(int i)
{
string s;
strstream ss;
ss << i;
ss >> s;
return s;
}
int main(int argc,char **argv)
{
multimap<string,string> m;
typedef multimap<string,string>::size_type sizeType;
for(sizeType i=0;i<10;i++){
m.insert(make_pair("zf","book"+i_to_s_2(i)));
m.insert(make_pair("yj","book"+i_to_s_2(i)));
}
/*
string name("zf");
sizeType cnt = m.count(name);
cout<<"count= "<<cnt<<endl;
multimap<string,string>::iterator map_iter = m.find(name);
for(sizeType i= 0; i != cnt; i++ )
{
cout<<map_iter->first<<" "<<map_iter->second<<endl;
++map_iter;
}
*/
string name("yj");
typedef map<string,string>::iterator it;
it beg = m.lower_bound(name);
it end = m.upper_bound(name);
while( beg != end){
cout<<beg->first<<" "<<beg->second<<endl;
beg++;
}
return 0;