映射不对比较器c ++进行排序

时间:2013-03-19 18:00:38

标签: c++ mingw

我正在尝试解决一个问题,即我将字符插入到<char, int>类型的地图中。如果char已经存在于map中,我会将int增加1.我已经创建了自己的比较器来优先处理map中的元素。优先级不会以我希望它的工作方式起作用,因为最终输出不遵循命令。

#include <iostream>
#include <string>
#include <map>
#include <iterator>

using namespace std;

struct classcomp {
  bool operator()(const int& a, const int& b) const {
        return a < b;
    }
};

bool isPresent(map<char,int,classcomp> mymap, char c){
    return (mymap.find('b') != mymap.end());
}

int main(){
    string input="dadbadddddddcabca";
    map<char,int,classcomp> mymap;
    char temp;

    for(string::iterator it = input.begin(); it!=input.end(); ++it){
        temp = *it;
        if(!isPresent(mymap, temp))
            mymap.insert(pair<char,int>(*it,1));
        else
            mymap[temp]++;
    }

    for (auto& x: mymap) {
        cout << x.first << ": " << x.second << '\n';
    }


    return 0;
}

提供以下输出:

a: 4
b: 2
c: 2
d: 8

6 个答案:

答案 0 :(得分:2)

比较器用于对char s而不是int进行排序。

它正在对键进行排序,似乎工作得很好 - a b c d

答案 1 :(得分:2)

std :: map旨在按键排序,为值类型提供比较器不会改变任何内容。想象你有std::map<char,char>,你怎么认为你可以提供价值比较器(如果可能的话)? 因此,解决方案是使用容器,允许按多个键排序,如boost :: multi_index或只创建另一个映射 - 反转:

#include <iostream>
#include <string>
#include <map>
#include <iterator>

using namespace std;

int main(){
    string input="dadbadddddddcabca";
    map<char,int> mymap;

    for(string::iterator it = input.begin(); it!=input.end(); ++it){
        mymap[*it]++;
    }
    map<int,char> reversemap;
    for (auto& x: mymap) {
        reversemap.insert( make_pair( x.second, x.first ) );
    }

    for (auto& x: reversemap ) {
        cout << x.first << ": " << x.second << '\n';
    }


    return 0;
}

请注意,对元素存在的预检查是完全冗余的,std :: map operator []创建新元素并初始化它(如果它不存在)。 你可能会注意到在输出中你现在缺少一些值(虽然它们已被排序),如果这不是你需要的,可以将reversemap类型从map更改为multimap,这允许重复密钥。

答案 2 :(得分:1)

map按键而不是值对其条目进行排序。 char密钥会在int

中以classcomp::operator()的形式静默投放

答案 3 :(得分:1)

为什么

mymap.find('b') != mymap.end());

而不是

mymap.find(c) != mymap.end());

答案 4 :(得分:0)

地图按其按键排序。

您的自定义比较器classcomp将应用于键而非值。

答案 5 :(得分:0)

也许这就是你想要的

int main() {
    std::string input="dadbadddddddcabca";
    typedef std::map< char, int > map_t;
    map_t mymap;
    char temp;

    for ( std::string::const_iterator it = input.begin(), e = input.end(); it != e; ++it ) {
        temp = *it;
        mymap[ temp ] = mymap[ temp ] + 1; // Hopufuly operator[] inserts zero initialized value, if can't find a key
    }
    typedef std::pair< typename map_t::key_type, typename map_t::mapped_type > pair_t;
    std::vector< pair_t > sortedByValue;
    sortedByValue.assign( mymap.begin(), mymap.end() );
    std::sort( sortedByValue.begin(), sortedByValue.end(), []( const pair_t & left, const pair_t & right ) {
        return left.second < right.second;
        // change to
        // return left.second > right.second;
        // for descend order
    } );

    for ( const auto & x: sortedByValue ) {
        std::cout << x.first << ": " << x.second << std::endl;
    }    
}

LWS link