std::map使用方式以及注意事项(关于相同key的问题)

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;
}

猜你喜欢

转载自blog.csdn.net/YiYeZhiNian/article/details/128497074