Как я могу получить все уникальные ключи в multimap

У меня есть multimap, и я хочу, чтобы все уникальные ключи в нем сохранялись в векторе.

  multimap<char,int> mymm;
  multimap<char,int>::iterator it;
  char c;

  mymm.insert(pair<char,int>('x',50));
  mymm.insert(pair<char,int>('y',100));
  mymm.insert(pair<char,int>('y',150));
  mymm.insert(pair<char,int>('y',200));
  mymm.insert(pair<char,int>('z',250));
  mymm.insert(pair<char,int>('z',300));

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

Добавлено: По уникальному я имею в виду все ключи в мультимажете один раз - их можно повторить или встретить один раз в мультимажете.

Таким образом, уникальные ключи - x, y и z

Ответ 1

Я пробовал это, и он работал

for(  multimap<char,int>::iterator it = mymm.begin(), end = mymm.end(); it != end; it = mymm.upper_bound(it->first))
  {
      cout << it->first << ' ' << it->second << endl;
  }

Ответ 2

Поскольку записи a std::multimap<> неявно отсортированы и выходят в отсортированном порядке при повторении через них, вы можете использовать алгоритм std::unique_copy для этого:

#include <iostream>
#include <map>
#include <algorithm>
#include <vector>

using namespace std;

int main() {

  /* ...Your existing code... */

  /* Create vector of deduplicated entries: */
  vector<pair<char,int>> keys_dedup;
  unique_copy(begin(mymm),
              end(mymm),
              back_inserter(keys_dedup),
              [](const pair<char,int> &entry1,
                 const pair<char,int> &entry2) {
                   return (entry1.first == entry2.first);
               }
             );

  /* Print unique keys, just to confirm. */
  for (const auto &entry : keys_dedup)
    cout << entry.first << '\n';

  cout.flush();
  return 0;
}

Дополнительная работа, добавленная этим, является линейной по количеству записей мультимапа, тогда как с использованием подхода std::set или Jeeva для дедупликации добавляются вычислительные шаги O (n log n).

Примечание. Я использую выражение lambda, использующее С++ 11. Это можно переписать для С++ 03.

Ответ 3

Итерации через все элементы mymm и сохраните it->first в set<char>.

Ответ 4

Я думаю, что вы можете сделать что-то подобное в случае, если unique означает ключ, который содержится в multimap только один раз:

1) постройте отсортированный list всех ключей на карте

2) перебирать список и находить уникальные ключи. Это просто, поскольку все дубликаты будут рядом друг с другом в сортированном контейнере

Если вы хотите только все клавиши - используйте std::set, как предположил Донотало

Ответ 5

Проще всего было бы поместить ключи мультимашины в unordered_set

unordered_multimap<string, string> m;

//insert data in multimap

unordered_set<string> s;         //set to store the unique keys

for(auto it = m.begin(); it != m.end(); it++){
    if(s.find(it->first) == s.end()){
        s.insert(it->first);
        auto its = m.equal_range(it->first);
        for(auto itr=its.first;itr!=its.second;itr++){
            cout<<itr->second<<" ";
        }
    }
}