Cha*_*_99 6 c++ dictionary stl const c++03
我需要一个只读的std:map数据结构,这意味着我必须用数据填充一次,然后只读取这些值,永远不要更改它们或添加其他值.
我的非const版本看起来像这样:
//in .h
#include <string>
#include <map>
std::map<std::string, int> myMap;
void initMap();
//in .cpp
#include "foo.h"
void initMap() {
myMap["Keys"] = 42;
}
Run Code Online (Sandbox Code Playgroud)
然后我会initMap()在我的代码中调用一次并完成.
现在我已经在这里阅读了几个问题,实现地图的常数似乎并非易事.
制作它std::map<std::string, const int>不会让我填写它initMap().使用非const temp填充它并且定义上的复制构造函数也不起作用,因为复制构造函数不容易将非const版本作为输入.
使它成为const std::map<std::string, int>(我可以在定义期间填充非const副本)将禁止使用[]运算符进行值访问.
那么有没有办法实现(值)const-ness并初始化结构(最好是在头文件中)?
顺便说一句:C++ 0x和C++ 11也不boost::是一个选项.
Mat*_*zar 14
你不能使用insert()可用的方法std::map吗?
http://www.cplusplus.com/reference/map/map/insert/
编辑:(解决方案) myMap.insert(std::pair<std::string, const int>("Keys", 42));
据我理解,为什么这个工作的原因是因为一对构造,pair (const first_type& a, const second_type& b),初始化它的成员first,并second使用构造函数first_type和second_type,以a和b它们各自的参数.
随着你试图使用该解决方案,我的理解是,myMap["Keys"] = 42;初始化成员second的map(类型const int使用默认的构造函数)int.然后尝试将值分配给该成员.由于这是在类的构造函数之外完成的map,因此const声明使得这不可能.
使用解决方案insert(),成员在构造函数中初始化pair.因此可以宣布它们const.pair复制到的时,完成相同的操作map.
虽然这对您来说是不可能的,但是其他想要这样做并且具有C++ 11兼容编译器的人可以使用统一初始化:
std::map<std::string, const int> myMap = {
{ "keys", 42 }
};
Run Code Online (Sandbox Code Playgroud)
哦,顺便说一下,不要在头文件中定义地图.而是在头文件中声明它extern,然后在源文件中定义它.