std::map的使用在C++开发中也是经常会用到的一些东西,这里进行一些简单的使用记录,包括如何插入、删除以及修改等。
1、std::map插入:
map的插入使用的是insert的方式,一个map包含了key与value两个值。首先需要对两个值进行赋值,然后对map执行insert操作,简单代码如下:
std::map<string,string> test_map;
string mapkey;
string mapvalue;
mapkey = "key1";
mapvalue = "value1";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
2、std::map查询:
注意在map中,key值是唯一的,所以一般查寻数据时我们都会查寻key值,map中的key值查寻使用find函数:
std::map<string,string>::iterator iter;
iter = test_map.find("key1");
if(iter!=test_map.end())
{
//处理函数
}
如果key值存在,则进入if语句,否则进入else
3、std::map删除:
map的删除使用的也是erase的方式,但是与容器不同,如果要删除整个map的话,可以通过:
test_map.erase();
这样子的形式,执行该语句可以清空整个test_map。但是如果要执行单独删除某个数据的话,需要通过指针的形式来完成:
iter = test_map.find("key1");
if(iter!=test_map.end())
{
iter = test_map.erase(iter);
}
上述的语句执行的是删除map中key值为key1的数据。
4、std::map遍历:
map的遍历跟容器不同,它一般通过迭代器进行遍历:
std::map<string,string>::iterator ite;
for(ite=test_map.begin();ite!=test_map.end();ite++)
{
cout<<"key:"<<ite->first<<" value:"<<ite->second<<endl;
}
定义一个迭代器,然后从begin()开始,end()结尾。
5、std::map相同key值的问题:
在map中,value是可以重复的,但是key是不可以的。如果此时地图中已经存在一个key时,我们再插入一个相同的key,这时候会发生什么呢?报错?或者覆盖掉之前的key以及对应的value?又或者跳过不处理?
简单通过一个小代码我们可以测试一下这个问题:
string mapkey;
string mapvalue;
mapkey = "key1";
mapvalue = "value1";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
mapkey = "key2";
mapvalue = "value2";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
mapkey = "key3";
mapvalue = "value3";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
mapkey = "key1";
mapvalue = "value4";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
cout<<"mapsize:"<<test_map.size()<<endl;
std::map<string,string>::iterator iter;
for(iter=test_map.begin();iter!=test_map.end();iter++)
{
cout<<"key:"<<iter->first<<" value:"<<iter->second<<endl;
}
在这个代码中,我们一共插入了四组数据。其中第四组数据与第一组数据的key值是相同的。然后我们打印一下map的大小以及具体数据,它会显示什么呢?往下看:
从这个结果我们已经看出来了map对于相同key值的处理方式:在已经存在一个key值是,如果我们执行插入相同的key值,算法不会覆盖原来的value,而且map中也不会存在两个相同的key,所以在使用map的时候我们需要注意这个问题,保证插入数据的时候每一组数据的key值是独一无二的。要不然可能会出现一些难以察觉的bug
完整测试代码:
#include "ros/ros.h"
using namespace std;
class map_test
{
private:
/* data */
std::map<string,string> test_map;
public:
map_test(/* args */);
~map_test();
void test();
};
map_test::map_test(/* args */)
{
ros::NodeHandle n;
}
void map_test::test()
{
string mapkey;
string mapvalue;
mapkey = "key1";
mapvalue = "value1";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
mapkey = "key2";
mapvalue = "value2";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
mapkey = "key3";
mapvalue = "value3";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
mapkey = "key1";
mapvalue = "value4";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
cout<<"mapsize:"<<test_map.size()<<endl;
std::map<string,string>::iterator iter;
for(iter=test_map.begin();iter!=test_map.end();iter++)
{
cout<<"key:"<<iter->first<<" value:"<<iter->second<<endl;
}
iter = test_map.find("key1");
if(iter!=test_map.end())
{
iter = test_map.erase(iter);
mapkey = "key1";
mapvalue = "value4";
test_map.insert(map<string,string>::value_type(mapkey,mapvalue));
}
cout<<"mapsize:"<<test_map.size()<<endl;
std::map<string,string>::iterator ite;
for(ite=test_map.begin();ite!=test_map.end();ite++)
{
cout<<"key:"<<ite->first<<" value:"<<ite->second<<endl;
}
}
map_test::~map_test()
{
}
int main(int argc, char **argv)
{
ros::init(argc,argv,"map_test");
map_test map_test_;
map_test_.test();
ros::spin();
return 0;
}