今天公司领导突然给了一个任务,使用到的map和数组,进公司快一年了,一直用的是c,c++似乎很久没用过了,这里记录一下。
#include <map>
#include <string>
#include <stdlib.h>
#include <stdio.h>
enum
{
TYPE_ID_0,
TYPE_ID_1,
TYPE_ID_2,
TYPE_ID_3,
TYPE_ID_4,
TYPE_ID_5,
TYPE_ID_6,
TYPE_ID_MAX
};
typedef struct mapData
{
int id;
std::string key;
}MapData;
std::map<std::string, MapData> g_mapData[TYPE_ID_MAX];
int changeMap(int type);
int main()
{
changeMap(2);
for(int i = 0 ; i < TYPE_ID_MAX; i++)
{
auto data = g_mapData[i];
for(auto it : data)
{
printf("i = %d, string: %s, id = %d, key = %s\n", i, it.first.c_str(), it.second.id, it.second.key.c_str());
}
}
return 0;
}
int changeMap(int type)
{
auto &data = g_mapData[type];
MapData newData = {20, "2000"};
data["1"] = newData;
data.insert(std::pair<std::string, MapData>("2", newData));
return 0;
}
这里定义了一个 map 的数组 std::map<std::string, MapData> g_mapData[TYPE_ID_MAX];
那么 g_mapData[i] 每一个都是map数据结构,而这个map里 key 是 std::string 类型,value 是一个结构体。
int changeMap(int type)
{
auto &data = g_mapData[type];
MapData newData = {20, "2000"};
data["1"] = newData;
data.insert(std::pair<std::string, MapData>("2", newData));
return 0;
}
这个函数主要修改数组的值,用的是引用,所以这样改之后,g_mapData[type] 这个数组下标就会有值了。这里添加数据用到了2种方法,一个是[]操作符,一个是insert()函数。而输出打印则用了一个c++11版本的for循环:for(auto it : data),这样的话,it 就是一个 std::pair<std::string, MapData> 类型,其 first 就是对应 std::string类型的key值, second 就是对应MapData 的 value值。但这个输出只会把非空的map打印出来了,如:
改用迭代器方式也是一样的输出
for(int i = 0 ; i < TYPE_ID_MAX; i++)
{
auto data = g_mapData[i];
for(auto ite = data.begin(); ite != data.end(); ite++)
{
printf("i = %d, string: %s, id = %d, key = %s\n", i, ite->first.c_str(), ite->second.id, ite->second.key.c_str());
}
}
输出和之前是一样的,因为空的 map 中 begin() 和 end() 是相等的,for循环不会执行的。