初始化静态地图的正确方法是什么?我们需要一个初始化它的静态函数吗?
使用C++ 11:
#include
使用Boost.Assign:
#include
最好的方法是使用一个功能:
#include
制作类似于提升的东西并不是一个复杂的问题.这是一个只有三个函数的类,包括构造函数,用于复制boost所做的(几乎).
templateclass create_map { private: std::map m_map; public: create_map(const T& key, const U& val) { m_map[key] = val; } create_map & operator()(const T& key, const U& val) { m_map[key] = val; return *this; } operator std::map () { return m_map; } };
用法:
std::map mymap = create_map(1,2)(3,4)(5,6);
上面的代码最适合初始化全局变量或需要初始化的类的静态成员,并且您不知道何时首先使用它,但您想确保其中的值可用.
如果说,你必须在现有的std :: map中插入元素......这里是你的另一个类.
templateclass map_add_values { private: MapType mMap; public: typedef typename MapType::key_type KeyType; typedef typename MapType::mapped_type MappedType; map_add_values(const KeyType& key, const MappedType& val) { mMap[key] = val; } map_add_values& operator()(const KeyType& key, const MappedType& val) { mMap[key] = val; return *this; } void to (MapType& map) { map.insert(mMap.begin(), mMap.end()); } };
用法:
typedef std::mapInt2IntMap; Int2IntMap testMap; map_add_values (1,2)(3,4)(5,6).to(testMap);
请在此处查看GCC 4.7.2:http://ideone.com/3uYJiH
###############以下一切已经过时#################
编辑:map_add_values
下面的类,这是我建议的原始解决方案,在GCC 4.5+时会失败.请查看上面的代码,了解如何向现有地图添加值.
templateclass map_add_values { private: std::map & m_map; public: map_add_values(std::map & _map):m_map(_map){} map_add_values& operator()(const T& _key, const U& _val) { m_map[key] = val; return *this; } };
用法:
std::mapmy_map; // Later somewhere along the code map_add_values (my_map)(1,2)(3,4)(5,6);
注意:以前我用a operator []
来添加实际值.dalle评论说这是不可能的.
#####################结束部分的结束#####################
这是使用2元素数据构造函数的另一种方法.初始化它不需要任何函数.没有第三方代码(Boost),没有静态函数或对象,没有技巧,只是简单的C++:
#include
自从我写这个答案后,C++ 11就出来了.您现在可以使用新的初始化列表功能直接初始化STL容器:
const MyMap myMap = { {"hello", 42}, {"world", 88} };
我将地图包装在静态对象中,并将地图初始化代码放在此对象的构造函数中,这样您就可以确保在执行初始化代码之前创建地图.
例如:
const std::mapg_logLevelsDescriptions = { { LoggerLevel::llNothing, "Logging disabled" }, { LoggerLevel::llInfo, "Base information" }, { LoggerLevel::llWarn, "Warnings" }, { LoggerLevel::llError, "Errors" }, { LoggerLevel::llDebug, "All information: debug-mode" } };
只是想分享纯C++ 98的工作原理:
#include
你可以试试:
std::mapmymap = { std::pair (1, 1), std::pair (2, 2), std::pair (2, 2) };
这类似于PierreBdR
,没有复制地图.
#include
如果您不熟悉C++ 98并且不想使用boost,那么我需要初始化静态映射时使用的解决方案:
typedef std::pair< int, char > elemPair_t; elemPair_t elemPairs[] = { elemPair_t( 1, 'a'), elemPair_t( 3, 'b' ), elemPair_t( 5, 'c' ), elemPair_t( 7, 'd' ) }; const std::map< int, char > myMap( &elemPairs[ 0 ], &elemPairs[ sizeof( elemPairs ) / sizeof( elemPairs[ 0 ] ) ] );