二维数组过载

two dimensional array overload

本文关键字:二维数组      更新时间:2023-10-16

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

关于如何有效地实施这一点,有什么建议吗?

我想真正的问题是如何实现双下标。基本的实施将照顾到实际的细节——尽管对此提出的建议也值得赞赏。

std::map为您提供operator[]中的"如果不存在则创建"功能

参见std::map::operator[]

如果k与容器中任何元素的键不匹配,函数将插入一个带有该键的新元素并返回对其映射值的引用。请注意,这总是将容器大小增加一,即使没有为元素分配映射值(元素是使用其默认构造函数构造的)。

或C++标准[23.4.4.3地图元素访问]

T&operator[](const key_type&x)

1效果:如果贴图中没有等效于x的关键帧,则插入value_type(x,T())。

2要求:key_type应为CopyInsertable,mapped_type应默认可插入*这个。

3返回:对*this中x对应的mapped_type的引用。

4复杂度:对数。

T&operator[](key_type&&x)

5效果:如果地图中没有等效于x的关键点,则插入value_type(std::move(x),T())到地图。

6要求:mapped_type应为DefaultInsertable into*this。

7返回:对*this中x对应的mapped_type的引用。

8复杂度:对数。

因此,如果你只添加操作员[]功能,你可以简单地进行

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";

它必须同时匹配Conf["key1"]["key2"] = "bar";Conf["key1"] = "foo";吗?

然后,您必须定义一个与当前配置相同的Section,但如下所示。

更改Config[]以返回一个&部分

使重载运算符=获取密钥(即std::string)这使得在运算符=中实现Conf["key1"] = "foo";成为可能

_sectionMap[""] = value;

并添加运算符std::string返回_sectionMap[""]

这使得Section关键字"与值Config[key1]相同。