我一直shown how to create a jagged multidimensional std::map
by using boost::any
。
但是,我在设置this answer中的值时遇到了问题。
当我使用
时accounts["bank"]["cash"] = 100;
gcc
会出现此错误
error: no match for ‘operator[]’ in ‘accounts.std::map<_Key, _Tp, _Compare,
_Alloc>::operator[]<std::basic_string<char>, boost::any,
std::less<std::basic_string<char> >, std::allocator<std::pair<const
std::basic_string<char>, boost::any> > >((* & std::basic_string<char>(((const
char*)"bank"), (*(const std::allocator<char>*)(& std::allocator<char>())))))["cash"]’
如何访问使用map
创建的锯齿状多维boost::any
? (如果有更好的技巧可以做到这一点,请告诉我。我只关心什么有效并且写得快。)
多维声明
std::map<std::string, boost::any> accounts;
accounts["bank"] = std::map<std::string, boost::any>();
accounts["bank"]["cash"] = 100;
我放弃并尝试使用json-spirit的mObject
,因为所有这些似乎已经内置。
有趣的是,使用完全相同的符号,我得到完全相同的错误。
答案 0 :(得分:1)
std::map<std::string, boost::any> accounts;
accounts["bank"] = std::map<std::string, boost::any>();
accounts["bank"]["cash"] = 100;
当然这会导致编译时错误,你把它放到boost :: any std :: map中, 但是编译器对此并不了解。 accounts [“bank”]有“boost :: any”类型, 和boost ::任何没有
int& operator[](const char *)
阅读boost :: any的工作原理:http://www.boost.org/doc/libs/1_54_0/doc/html/any/s02.html
修复很简单:
#include <boost/any.hpp>
#include <map>
#include <string>
int main()
{
std::map<std::string, boost::any> accounts;
accounts["cash"] = 100;
accounts["bank"] = std::map<std::string, boost::any>();
boost::any_cast<std::map<std::string, boost::any> &>(accounts["bank"])["cash"] = 100;
}
答案 1 :(得分:0)
您是如何定义帐户地图的?正如鲍里斯所说,你需要将两张地图嵌套在一起,以便做你想做的事。
用boost :: any
替换类型字符串#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, map<string, string>> accounts;
accounts["bank"]["cash"] = "infinity";
cout << accounts["bank"]["cash"];
return 0;
}
accounts [“bank”]返回最外面的地图的值,对应于
map<string, **map<string, string>**>
accounts [“bank”] [“cash”]返回最里面的地图的值,对应于
map<string, map<string, **string**>>
定义一维地图不允许你做你想做的事情,但二维地图可以做到。