如何获取多图中的所有唯一键

AJ.*_*AJ. 18 c++ stl std 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));
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?有方法可以使用键计算元素数,但不计算多图中唯一键的数量.

补充:通过唯一我指的是multimap中的所有键一次 - 它们可以在multimap中重复或出现一次.

所以这里的唯一键是-x,yz

Jee*_*eva 36

我试过这个并且它有效

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;
  }
Run Code Online (Sandbox Code Playgroud)

  • @AJ看到`upper_bound`部分,这应该只打印每个键一次 (5认同)
  • @AJ:你确定吗?代码工作[当我尝试时](http://ideone.com/r0Ul5). (3认同)
  • @Roman:不,不是。见 http://en.cppreference.com/w/cpp/container/multimap/upper_bound (2认同)

jog*_*pan 16

由于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;
}
Run Code Online (Sandbox Code Playgroud)

由此添加的额外工作在多图的条目数中是线性的,而使用std::set或Jeeva的重复数据删除方法都添加O(n log n)计算步骤.

备注:我使用的lambda表达式假定为C++ 11.可以为C++ 03重写这个.

  • 为什么std :: multimap中没有所有唯一键的简单矢量/列表/集合/映射。这似乎很有用,并且没有太多开销。因为人们不会使用太多此功能,或者因为开销超出了我的预期,所以此功能不存在吗?我认为空间不是必需的(对吗?)。 (2认同)

Don*_*alo 7

迭代所有元素mymm,并存储it->first在一个set<char>.

  • @Andrew `set` 只会保留唯一的元素。它_将_给出唯一的键。 (2认同)