我已经使用stl :: map后端实现了包含配置数据的结构。我已将[]运算符实现为:
string& config:operator[] ( const string theKey )
{
ParamMapIter iter;
iter = _configMap.find ( theKey );
if ( iter == _configMap.end() )
{
_configMap[theKey] = ""; // Create a new blank key/value when missing key
}
return _configMap[theKey];
}
所以我可以做像
这样的事情Conf["key"] = "value";
现在,我想将这个半二维方式与旧式Windows配置文件与单独的部分相匹配。例如所以我可以写
Conf["section"] ["key"] = "value";
有关如何有效实施此建议的任何建议?
我想真正的问题是如何实现双下标。底层实现将处理实际细节 - 尽管对此的建议也表示赞赏。
答案 0 :(得分:1)
std :: map 为您提供运营商[]
中的“如果不存在则创建”功能如果k与容器中的任何元素的键不匹配,该函数会使用该键插入新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素
),这也会将容器大小增加1。
或C ++标准[ 23.4.4.3地图元素访问]
<强> T&安培; operator [](const key_type&amp; x);
1效果:如果地图中没有等效于x的键,则插入 value_type(x,T())进入地图。
2要求:key_type应为CopyInsertable,而mapped_type应为 DefaultInsertable into *此。
3返回:对* this中的x对应的mapped_type的引用。
4复杂性:对数。
<强> T&安培; operator [](key_type&amp;&amp; x);
5效果:如果地图中没有等效于x的键,则插入 value_type(std :: move(x),T())成 地图。
6要求:mapped_type应为DefaultInsertable到* this。
7返回:对* this中的x对应的mapped_type的引用。
8复杂性:对数。
因此,如果您只添加operator []功能,则只需执行
即可typedef std::map<std::string, std::map<std::string, std::string>> config;
// or in C++11 style
// using config = std::map<std::string, std::map<std::string, std::string>>;
config Conf;
std::map<std::string, std::string>& section = Conf["Section"];
// or again in C++11
// auto §ion = Conf["Section"];
section["key"] = "value";
答案 1 :(得分:1)
是否必须同时匹配Conf["key1"]["key2"] = "bar";
和Conf["key1"] = "foo";
?
然后你必须定义一个与你当前的Config类似的Section,除了下面的内容。
更改Config []以返回&amp; Section。
创建一个重载运算符=获取一个键(即一个std :: string),这样就可以在operator =
中实现Conf["key1"] = "foo";
_sectionMap[""] = value;
并添加operator std :: string以返回_sectionMap[""]
这使得Section键&#34;&#34;与值Config[key1]
相同。