Преобразование карты с несколькими ключами в «обычную» карту, объединяющую несколько ключей

#c #maps #duplicates

#c #Карты #дубликаты

Вопрос:

Я ищу способ «привязать» карту с несколькими ключами к обычной карте. Моя мультимап выглядит так:

 Key                 v a l u e s 
<string>            <string>

140,1,08,2500       1456 
140,1,10,3040       1456 
.............       ....
.............       ....
140,1,08,2500       8g   
140,1,13,3040       8g   
.............       ....
 

Первый и предпоследний ключ идентичны. Моя цель — объединить эти две (и все другие пары повторяющихся ключей) строки, чтобы в результате:

 140,1,08,2500       14568g
 

Значения, принадлежащие двум исходным ключам, объединяются. Теперь я мог бы написать какой-нибудь хороший цикл и выполнять итерации, копировать и удалять материалы и так далее, Но мне интересно, знает ли кто-нибудь умный, может быть, даже быстрый способ сделать это.

Ответ №1:

Сохраняйте простоту…

 map<string, string> new_map;

for(auto it = mmap.begin(), end = mmap.end(); it != end;   it)
{
  new_map[it->first].append(it->second);
}
 

Зачем усложнять?

Ответ №2:

Если элементы в multimap хранятся в правильном порядке (т. Е. Вы знаете, что 1456 это всегда повторяется раньше 8g , тогда вы можете выполнить простой цикл:

 std::map< key_t, string > resu<
for ( multimap_t::const_iterator it = mm.begin(); it != mm.end();   it ) {
   result[ it->first ].append( it->second );
}
 

Проблема в том, что я не думаю, что порядок элементов, использующих общий ключ, гарантирован.

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

1. AFAIK, для одного и того же ключа он поддерживает порядок вставки, хотя это может быть определено реализацией.

2. @Nim: проблема в том, что стандарт этого не гарантирует.

3. правда, я не мог видеть никаких упоминаний об этом даже в новом стандарте, поэтому я сказал, что, скорее всего, это определено реализацией, это зависит от OP, чтобы определить, есть ли какой-либо другой естественный порядок для применения…