3

type のマップに char を挿入する問題を解決しようとしています<char, int>。char がマップに既に存在する場合は、int を 1 増やします。マップ内の要素に優先順位を付けるための独自のコンパレータを作成しました。優先順位は、最終的に出力が順序に従わないため、期待どおりに機能しません。

#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
4

5 に答える 5

2

charコンパレータは、 s ではなく sをソートするために使用されますint

キーを並べ替えており、問題なく動作しているようです - a b c d

于 2013-03-19T18:04:03.347 に答える
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 に変更して、キーの重複を許可します。

于 2013-03-19T18:21:11.647 に答える
1

mapエントリを値ではなくキーで並べ替えます。charキーは静かにあなたの中にキャストされintますclasscomp::operator()

于 2013-03-19T18:03:03.420 に答える
1

どうして

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

そしてそうではない

mymap.find(c) != mymap.end());
于 2013-03-19T18:05:29.640 に答える
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 リンク

于 2013-03-19T18:21:39.577 に答える