Как отметил Стив Таунсенд, std::map
похожа по своей концепции, но имеет другую реализацию.
Создание вашего вложенного контейнера в C ++ немного более многословно:
#include <tr1/unordered_map>
#include <iostream>
typedef std::tr1::unordered_map< std::string, int > Inner;
typedef std::tr1::unordered_map< std::string, Inner > Outer;
int main()
{
Outer foo;
Inner::value_type bar1_data[] = {
Inner::value_type("Default", 0),
Inner::value_type("Value", 0),
};
const size_t n_bar1_data = sizeof(bar1_data) / sizeof(*bar1_data);
foo["bar1"] = Inner(bar1_data, bar1_data + n_bar1_data);
Inner::value_type bar2_data[] = {
Inner::value_type("Default", 2),
Inner::value_type("value", 5),
Inner::value_type("other", 4),
};
const size_t n_bar2_data = sizeof(bar2_data) / sizeof(*bar2_data);
foo["bar2"] = Inner(bar2_data, bar2_data + n_bar2_data);
Как описанов perlref стрелки между подписывающими скобками являются необязательными, поэтому вы могли бы написать (прокомментировать для поддержки потока программы на C ++)
// $foo{"bar1"}{"Default"} = 15;
, что довольно близко к C ++:
foo["bar1"]["Default"] = 15;
Для правильности измерения мы печатаем полученную структуру и возвращаем 0 из main
:
for (Outer::const_iterator o = foo.begin(); o != foo.end(); ++o) {
std::cout << o->first << ":\n";
for (Inner::const_iterator i = o->second.begin(); i != o->second.end(); ++i)
std::cout << " - " << i->first << " => " << i->second << '\n';
}
return 0;
}
Вывод:
bar1:
- Value => 0
- Default => 15
bar2:
- Default => 2
- value => 5
- other => 4
ПРИМЕЧАНИЕ: В этой игрушечной программе порядок ввода и вывода одинаков, но не зависит от этого поведения!
Если вместо этого вы предпочитаете использовать boost::unordered_map
, измените несколько строк вверх вашей программы:
#include <boost/unordered_map.hpp>
typedef boost::unordered_map< std::string, int > Inner;
typedef boost::unordered_map< std::string, Inner > Outer;