c++ - 無効 - マルチマップ内のすべての固有キーを取得する方法




kms 権限 (4)

mymmすべての要素をmymmit->firstset<char>格納します。

私はマルチマップを持っており、その中にあるすべての固有のキーをベクトルに格納する必要があります。

  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));

これどうやってするの? キーを持つ要素の数を数える方法はありますが、マルチマップ内の一意のキーの数を数える方法はありません。

Added:ユニークなことは、マルチマップのすべてのキーを一度意味します。マルチマップで一度だけ繰り返すことができます。

ここで一意のキーは - xyzです


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)の計算ステップが追加されます。

備考:私が使用するラムダ式は、C ++ 11を前提としています。 これはC ++ 03のためにこれを書き換えることが可能です。


私はあなたがunique場合にmultimap一度しか含まれていないキーを意味する場合に、このようなことをすることができると思います:

1)マップ内のすべてのキーのソートされたlistを作成する

2)リストを反復し、一意のキーを見つける。 すべての重複がソートされたコンテナ内でお互いに近くなるのでシンプルです

ちょうどすべてのキーが必要な場合 - を使用してstd::setとしてDonotalo提案


私はこれを試して、それが働いた

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;
  }




multimap