Печать multimap в multimap (вложенные карты)

#c #map #nested #multimap

#c #Карта #вложенный #multimap

Вопрос:

Я пытаюсь распечатать вложенную multimap, но не нашел способа (или обсуждения здесь), который помог бы мне решить проблему.

То, как я обычно печатаю multimap, выглядит примерно так:

 template<typename a, typename b>
void printMMap1(std::multimap<a, b>thing){
 for (std::multimap<a,b>::iterator it = thing.begin(); it != thing.end(); it  ){
    std::cout << it->first << " : " << it->second << std::endl;
  }
}
  

Но теперь я хочу использовать ту же мотивацию для печати:

 multimap<multimap<a,b>, multimap<c,d>> MAPname;
  

Похоже, это не работает:

 template<typename aa, typename bb, typename cc>
void printMMap(std::multimap<std::multimap<aa, bb>, std::multimap<aa, cc>>thing){
    for (std::multimap<std::multimap<aa, bb>, std::multimap<aa, cc>>::iterator it = thing.begin(); it != thing.end(); it  ){
    std::cout << it->first.first << " : " << it->first.second << std::endl <<
            it->second.first << " : " << it->second.second << std::endl;
}
  

}

Любая помощь / предложения будут высоко оценены!

Спасибо за вашу помощь.

_ПРАВИТЬ:

Используя мотивацию из примера хансмаада, я придумал что-то близкое к решению, которое я хотел бы (ниже):

 //N.B: I removed the "auto"s for educational purposes (mostly for myself and other beginners)

template<typename a, typename b>
void print1(const std::multimap<a, b>amp; thing){
for (std::multimap<a,b>::const_iterator it = begin(thing); it != thing.end(); it  ){
   std::cout << it->first << " : " << it->second << std::endl;
   }
}



template<typename aa, typename bb, typename cc>
void print2(const std::multimap<std::multimap<aa, bb>, std::multimap<aa, cc>>amp; thing){
std::multimap<std::multimap<aa, bb>, std::multimap<aa, cc>>::const_reverse_iterator it = thing.rbegin();

//why reverse iterator? Because I noticed that the loop which duplicates the output has a final iteration equal to the desired output, so I only use the last iteration i.e. going backwards ("rbegin")

std::multimap<aa, bb> keyMap = it->first;
std::multimap<aa, cc> valueMap = it->second;

std::cout << "keyn";
print1(keyMap);
std::cout << "valuen";
print1(valueMap);

}
  

Это печатает это решение, которое на 90% близко к тому, что я хочу. Например, он печатает:

 key
a_key1 : a_value1
a_key2 : a_value1
a_key2 : a_value2
a_key2 : a_value3
a_key3 : a_value1
a_key3 : a_value2
a_key3 : a_value3
a_key3 : a_value4

value
b_key1 : b_value1
b_key1 : b_value2
b_key1 : b_value3
b_key1 : b_value4
b_key2 : b_value1
b_key3 : b_value1
b_key4 : b_value1
b_key4 : b_value2
  

В то время как я хочу напечатать тот же результат, хотя и отформатированный следующим образом:

 key                  value 
a_key1 : a_value1    b_key1 : b_value1
a_key2 : a_value1    b_key1 : b_value2
a_key2 : a_value2    b_key1 : b_value3
a_key2 : a_value3    b_key1 : b_value4
a_key3 : a_value1    b_key2 : b_value1
a_key3 : a_value2    b_key3 : b_value1
a_key3 : a_value3    b_key4 : b_value1
a_key3 : a_value4    b_key4 : b_value2
  

Небольшая разница. Я чувствую, что я близок.

Комментарии:

1. Что вы имели в виду, говоря, что это не работает?

2. Ну, как сказал хансмаад позже, multimap<aa,bb> amp;amp; multimap<aa,cc> не имеют «первого» в качестве члена. Я хочу напечатать ==> «ключ1: значение1, ключ2: значение2, ключ3: значение3» и т. Д., Но я могу выполнить только ==> «ключ1: значение1, ключ1: значение1, ключ2: значение2, ключ1: значение1, ключ2: значение3, ключ3: значение3» и т. Д. Он дублирует вывод. Имеет ли это смысл?

Ответ №1:

Я не уверен, чего вы ожидаете от своей printMMap функции, но проблема с вашим кодом заключается в it->first.first

 template<typename aa, typename bb, typename cc>
void printMMap(std::multimap<std::multimap<aa, bb>, std::multimap<aa, cc>>thing){
    for (std::multimap<std::multimap<aa, bb>, std::multimap<aa, cc>>::iterator it = thing.begin(); it != thing.end(); it  ){
            // std::multimap<aa, bb> x = it->first;
            // std::multimap<aa, bb> y = it->second;
            // x, y don't have a member 'first', they are multimaps
            // broken:
            std::cout << it->first.first /*...*/ it->second.second << std::endl;
    }
}
  

Вы могли бы сделать, например:

 template<typename a, typename b>
void print(const std::multimap<a, b>amp; thing){
    for (auto it = begin(thing); it != end(thing);   it){
        std::cout << it->first << " : " << it->second << std::endl;
    }
}

template<typename aa, typename bb, typename cc>
void print(const std::multimap<std::multimap<aa, bb>, std::multimap<aa, cc>>amp; thing){
    for (auto it = begin(thing); it != end(thing);   it){
        autoamp; keyMap = it->first;
        autoamp; valueMap = it->second;
        std::cout << "keyn";
        print(keyMap);
        std::cout << "valuen";
        print(valueMap);
    }
}
  

Который будет печатать для

     multimap<multimap<int, int>, multimap<int, int>> mmap;
    multimap<int, int> key{ { 1, 1 }, { 1, 2 }, { 2, 4 } };
    multimap<int, int> value{ { 10, 1 } };
    mmap.emplace(move(key), move(value));
    print(mmap);


>key
>1 : 1
>1 : 2
>2 : 4
>value
>10 : 1
  

Комментарии:

1. Спасибо, хансмаад! Проблема, с которой я столкнулся с вашим кодом, была проблемой, с которой я столкнулся, когда попробовал что-то подобное. Теперь у вас есть цикл внутри цикла, который дублирует вывод, который я планировал вывести. Имеет ли это смысл? И есть ли у вас какие-либо идеи, как печатать без дубликата?

2. Привет, хансмаад: я хочу напечатать что-то вроде ==> «ключ1: значение1, ключ2: значение2, ключ3: значение3» и т. Д., Но я могу выполнить только ==> «ключ1: значение1, ключ1: значение1, ключ2: значение2, ключ1: значение1, ключ2: значение2, ключ3:value3,» и т.д. Он дублирует вывод.