如何从多图删除重复的字符串值

时间:2018-08-17 14:41:07

标签: c++ unique multimap

我有一个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

2 个答案:

答案 0 :(得分:4)

如果可以,将std::multimap替换为std::mapstd::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函数一起使用