我有一个多图,我希望将其中的所有唯一键存储在矢量中。
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
答案 0 :(得分:32)
我试过这个并且有效
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;
}
答案 1 :(得分:14)
由于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表达式假定为C ++ 11。可以为C ++ 03重写这个。
答案 2 :(得分:5)
遍历mymm
的所有元素,并将it->first
存储在set<char>
中。
答案 3 :(得分:2)
最简单的方法是将multimap的键放在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<<" ";
}
}
}
答案 4 :(得分:1)
我认为您可以通过unique
执行类似的操作,您的意思是multimap
中仅包含一次的密钥:
1)构建地图中所有键的已排序list
2)遍历列表并找到唯一键。这很简单,因为所有重复项都会在一个已排序的容器中彼此靠近
如果您只想要所有密钥 - 请使用std::set
作为Donotalo建议的
答案 5 :(得分:0)
其他选择是将它们插入向量中,然后仅使用std::sort
和std::unique
template<typename Container> static
std::vector<typename Container::key_type> unique_keys(Container A)
{
using ValueType = typename Container::key_type;
std::vector<ValueType> v;
for(auto ele : A)
{
v.push_back(ele.first);
}
std::sort(v.begin(), v.end());
auto it = std::unique(v.begin(), v.end());
v.resize(distance(v.begin(),it));
return v;
}
答案 6 :(得分:0)
这可以在O(N)中完成,其中N是地图的大小;您的钥匙不需要有订单操作员:
template<typename Container>
std::vector<typename Container::key_type> UniqueKeys (const Container &A)
{
std::vector<typename Container::key_type> v;
auto prevIter = A.begin ();
for (auto iter = A.begin (); iter != A.end(); ++iter)
{
if (prevIter->first == iter->first)
continue;
v.push_back (prevIter->first);
prevIter = iter;
}
if (prevIter != A.end ())
v.push_back (prevIter->first);
return v;
}