C++中map类设为const时的初始化方法

本文详细介绍了在C++中如何初始化const修饰的map,包括直接初始化和const static修饰的map的初始化方法。对于const static map,需将声明与初始化分别置于.h与.cpp文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const map的初始化

首先,在C++中,一个被const修饰的变量是需要在声明时就进行赋值的,那么,对于复杂类型,该如何进行初始化?
对于一个仅被const修饰的map,我们可以用如下方式进行初始化
在这里插入图片描述
相比C#的Dictionary的初始化,我们需要在每组值前面加上std::map<T1,T2>::value_type,value_type是泛型编程中用于同一访问容器元素的一个typedef(下图是由于C++11中用using取代了typedef)
C++中map的value_type来源

const static的初始化

当一个map再加上static修饰符时,就无法再使用上文的方法进行初始化了,编译器会抛出如下错误:
在这里插入图片描述
这里,我们就需要将声明和初始化分开写了,首先,在类中声明这个变量(这里在MailClientSocket.h中进行声明)
在这里插入图片描述
然后,转到MailClientSocket.cpp中进行初始化
在这里插入图片描述
如果将初始化放在MailClientSocket.h中,编译器会抛出一个重定义的错误
在这里插入图片描述
也就是说对于一个const static map的变量,我们的声明和初始化需要分放在 .h 以及 .cpp 中才可以。

C++初始化`std::map`有几种常见的方法: ### 1. 使用构造函数直接初始化 ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap = { {1, "one"}, {2, "two"}, {3, "three"} }; for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` 这种方法通过大括号 `{}` 直接列出键值对,简洁明了。 ### 2. 插入元素法 可以在创建 `map` 后再逐个插入元素: ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap; myMap.insert(std::make_pair(1, "one")); myMap.insert({2, "two"}); // C++11 起可以直接使用这种简化的pair形式 // 或者使用方括acket语法(如果键不存在,则会自动添加) myMap[3] = "three"; for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` 注意:使用下标操作符 `[key]` 方式赋值,若该 key 已存在则更新其 value;否则将新建一个以此 key 和指定 value 的新映射项。 ### 3. 利用范围构造器从另一个容器复制数据 如果你有一个包含成对元素的数组或其他序列化结构体也可以方便地转换为 map 型的对象: ```cpp #include <iostream> #include <map> #include <vector> int main(){ std::vector<std::pair<const int,std::string>> vec = {{4,"four"},{5,"five"}}; std::map<int,std::string> another_map(vec.begin(),vec.end()); for(auto &p:another_map){ std::cout<<"Key:"<< p.first <<" Value:"<< p.second<<"\n"; } return 0; } ``` 这里我们先准备了一个 vector 容器来存储若干个键值对的数据,然后将其迭代区间传递给目标 Map 对象作为输入源完成批量加载工作。 除了以上三种常见的方式外,在现代 C++ 版本里还有其他更灵活的选择如 emplace 系列成员函数用于就地构建而非搬移已有实例等特性支持更为高效的操作模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值