我有一个std::multimap
,其中有多个条目具有相同的键和值,我想删除所有重复的值,只保留索引最高的那个。
到目前为止,我有这样的事情:
#include <iostream>
#include<iterator>
#include <map>
int main(void)
{
std::multimap<double, std::string> m;
m.insert(std::pair<double,std::string>(79.43567,"ARH1265"));
m.insert(std::pair<double,std::string>(82.96567,"ARH1265"));
m.insert(std::pair<double,std::string>(94.03261,"TE5748"));
m.insert(std::pair<double,std::string>(73.53961,"TE5748"));
m.insert(std::pair<double,std::string>(93.43567,"CRP5285"));
std::cout << "size: " << m.size() << std::endl;
std::multimap<double, std::string>::iterator it;
for (it = m.begin(); i!=m.end(); i++) {
// ???
}
}
最后,我想得到一张地图,其中有三个条目:
82.96567, ARH1265
94.03261, TE5748
93.43567, CRP5285
答案 0 :(得分:4)
如果可以,将std::multimap
替换为std::map
或std::unordered_map
,然后反转键和值。 (键= string
和值= double
)。
插入时,请检查您要插入的值是否大于地图中的值,否则请不要插入。
如果您不能替换多图,则可以将以上方法用于临时图,清除多图,然后将临时图的内容重新插入多图。
答案 1 :(得分:1)
{
std::unordered_set<std::string> already_seen;
for (it = m.begin(); i!=m.end(); i++) {
if (already_seen.find(it->second) != already_seen.end())
m.erase(it);
else
already_seen.insert(it->second);
}
}
如果您愿意尝试,也可以将stl中的std::remove_if
与lambda函数一起使用