二维数组重载

时间:2014-09-11 11:29:20

标签: c++ map stl

我已经使用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";

有关如何有效实施此建议的任何建议?

我想真正的问题是如何实现双下标。底层实现将处理实际细节 - 尽管对此的建议也表示赞赏。

2 个答案:

答案 0 :(得分:1)

std :: map 为您提供运营商[]

中的“如果不存在则创建”功能

请参阅std::map::operator[]

  

如果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 &section = 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]相同。