#c #arrays #multidimensional-array
#c #массивы #многомерный массив
Вопрос:
Я новичок в C и недавно обнаружил, что мы можем инициализировать коллекцию строк, используя следующий код:
map <string,string> myArray;
myArray["key1"] = "value1";
myArray["key2"] = "value2";
cout<<myArray["key1"]<<endl; //result: value1
Но что, если мне нужно назначить key2
не строку, а другую коллекцию? Вот как, я полагаю, это будет выглядеть:
map <string, ???another map???> myArray;
map<string,string> secondArray;
secondArray["foo"] = "bar";
myArray["key1"] = "value1";
myArray["key2"] = secondArray;
cout<<myArray["key2"]["foo"]<<endl; //expected result: bar
Возможно ли это?
Комментарии:
1. Карты @Cat — это ассоциативные массивы, не так ли?
2. @anirudh4444 Это ассоциативные массивы, но термин » массив » сам по себе обычно ассоциируется с постоянным доступом к элементу времени.
3. @anirudh4444: Ну, тогда ассоциативные массивы — это не массивы (и мне все равно не нравится это название). Массивы имеют непрерывное хранилище. Сопоставления обычно этого не делают.
Ответ №1:
Звучит так, как будто вы хотите
std::map<std::string, boost::any> myArray;
который позволит значениям, соответствующим разным ключам, принимать разные типы.
Ответ №2:
Поскольку спрашивающий, похоже, принял один из ответов, это всего лишь дополнение.
Если Boost
это разрешено, Boost.Variant может соответствовать цели.
Например, следующий код выводится bar
как в вопросе.
#include <boost/variant.hpp>
#include <map>
#include <string>
#include <iostream>
int main() {
using namespace std;
using namespace boost;
typedef map<string,string> map_t;
map <string, variant<string, map_t> > myArray;
map_t secondArray;
secondArray["foo"] = "bar";
myArray["key1"] = "value1";
myArray["key2"] = secondArray;
cout<<get< map_t >( myArray["key2"] )["foo"]<<endl;
}
Вот тест на ideone.
Ответ №3:
Объявить myArray
как
map <string, map <string,string> > myArray;
Очевидно, что вы не можете сделать myArray["key1"] = "value1";
больше, но это компромисс строго типизированного языка.