由于工作中经常用到map来进行数据保存和数据遍历,这里来总结一下,先看看C++ Primer这么描述的。map属于关联容器,定义了一个关联数组,类似vector,map是一个类模板。但是一个map要用两个类型来定义:关键字的类型和关键值的类型。在一个map中,一个给定关键字只能出现一次,每个关键字关联一个特定的值。解引用一个map迭代器会生成一个pair,它保存一个const关键字及其关联的值。话不多说,看代码,为了简洁,我省略了头文件。
1.map的遍历
int main()
{
map<string,int> word={{"a",1},{"b",2}};
map<string,int>::iterator IT;
for(IT=word.begin();IT!=word.end();IT++)
{
cout<<IT->first<<','<<IT->second<<endl;
}
return 0;
}
打印:a,1
b,2
2.map的插入操作(insert)。insert函数操作的返回值是一个pair,其first成员是一个迭代器,指向具有给定关键字的元素,second的成员是一个bool值
int main()
{
map<string,int> word;
pair<map<string,int>::iterator,bool> ret;//定义insert的返回值
ret=word.insert(pair<string,int>("a",1));
if(ret.second)
{
cout<<"yes"<<endl;
cout<<ret.first->second<<endl;
}
return 0;
}
打印:yes
1
3.map的删除操作(erase)
int main()
{
map<string,int>word={{"a",1},{"b",2},{"c",3}};
int num=word.erase("a")//利用关键字删除,返回删除元素的数量。鸡肋
cout<<num<<endl;
map<string,int>::iterator IT=word.begin();//注意这里IT重新赋值,因为前面删除过一个迭代器,指向不明确了
map<string,int>::iterator IT1;
IT1=word.erase(IT);//word.erase.(IT++) 这样。返回的迭代器仍指向下一个迭代器
cout<<IT1->first<<','<<IT1->second<<endl;
IT=word.begin();
IT1=word.end();
word.erase(IT,IT1);//根据范围迭代器进行删除,返回IT1
return 0;
}
打印:1
b,2
IT++是自加操作,将IT指向下一个地址并且返回IT原来的副本。参数的处理优先于函数的调用。不信看
void func(map<string,int>::iterator it)
{
cout<<it->first<<','<<it->second<<endl;
}
int main()
{
map<string,int>word={{"a",1},{"b",2}};
map<string,int>::iterator IT=word.begin();
func(IT++);
cout<<IT->first<<','<<IT->second<<endl;
return 0;
}
打印:a,1
b,2
4.map中元素的查找(find),返回一个迭代器,指向第一个关键字为key的元素,没找到则返回map的尾部迭代器
int main()
{
map<string,int>word={{"a",1}};
map<string,int>::iterator IT;
IT=word.find("a");
cout<<IT->first<<','<<IT->second<<endl;
return 0;
}
打印:a,1
map还有clear(),count(),empty(),size(),swap()等函数
平常学习中,map中对应的关键值只存放一个元素。实际工作中需要存放多个元素,此时关键值变为结构体了。
struct Node
{
int data;
int data1;
};
int main()
{
map<int,Node> Map;//struct标识不需要写进去
Map.insert(pair<int,Node>(1,{2,3}));
map<int,Node>::iterator it=Map.begin();
cout<<it->second.data<<','<<it->second.data1<<endl;
return 0;
}
打印:2,3