二维数组过载
two dimensional array overload
我已经使用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 §ion = 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]
相同。
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 在函数中传递二维数组
- 为什么指针在对二维数组进行排序时无法正常工作?
- 创建 std::string 的二维数组的最佳做法
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 元素在二维数组 c++ 中的出现次数
- 执行 c++ 二维数组
- C++ 中的二维数组初始化为一个值
- 在C++中初始化第一维大小未知的二维数组
- 如何在二维数组中存储值?