25

マルチマップがあり、その中のすべての一意のキーを取得してベクターに格納したいと考えています。

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

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

追加:一意とは、マルチマップ内のすべてのキーが 1 回であることを意味します。マルチマップ内で繰り返されるか、1 回発生する可能性があります。

ここでの一意のキーは - xy、およびzです

4

7 に答える 7

19

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重複排除に a または Jeeva のアプローチを使用すると、両方とも O(n log n) の計算ステップが追加されます。

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

于 2012-07-19T06:47:12.717 に答える
8

のすべての要素を反復処理しmymm、 に格納it->firstset<char>ます。

于 2012-07-19T06:17:08.840 に答える
1

一度だけにunique含まれるキーを意味する場合は、次のようなことができると思います。multimap

list1)マップ内のすべてのキーのソートを構築します

2) リストを繰り返し処理し、一意のキーを見つけます。すべての重複はソートされたコンテナー内で互いに近くにあるため、簡単です。

すべてのキーだけが必要な場合 -std::setドノタロが提案したように使用してください

于 2012-07-19T06:16:35.157 に答える