3

さまざまな文字列をマップに保存する必要がありましたが、サイズ順に並べておきたいと思いました。

次のような述語を使用します。

struct strsize_less {
    bool operator()(const string& l, const string& r) {
        return l.size() < r.size();
    };
};

順序付けは完了しますが、同じサイズの文字列は破棄されます

int main() {
    typedef map<string, int, strsize_less> mymap_t;
    mymap_t mymap;

    mymap["j"    ] = 0;
    mymap["i"    ] = 1;
    mymap["hh"   ] = 2;
    mymap["gg"   ] = 3;
    mymap["fff"  ] = 4;
    mymap["eee"  ] = 5;
    mymap["dddd" ] = 6;
    mymap["cccc" ] = 7;
    mymap["bbbbb"] = 8;
    mymap["aaaaa"] = 9;

    for( mymap_t::iterator i = mymap.begin(); i!=mymap.end(); ++i )
        cout << "k = " << i->first << " - > v= " << i->second << endl;

    return 0;
}

出力は次のとおりです。

k = j - > v= 1
k = hh - > v= 3
k = fff - > v= 5
k = dddd - > v= 7
k = bbbbb - > v= 9

私の質問:次の出力を達成するために使用できる述語はありますか?

k = j - > v= 0
k = i - > v= 1
k = hh - > v= 2
k = gg - > v= 3 
k = fff - > v= 4
k = eee - > v= 5
k = dddd - > v= 6
k = cccc - > v= 7
k = bbbbb - > v= 8
k = aaaaa - > v= 9
4

2 に答える 2

14

コンパレータでサイズと文字列の両方を比較します。

struct strsize_less
{
    bool operator()(std::string const& l, std::string const& r) const
    {
        if (l.size() < r.size())
            return true;

        if (l.size() > r.size())
            return false;

        return l < r;
    };
};

または、C ++ 11を使用しますstd::tie

struct strsize_less
{
    bool operator()(std::string const& l, std::string const& r) const
    {
        return std::tie(l.size(), l) < std::tie(r.size(), r);
    };
};
于 2012-07-03T17:24:19.673 に答える
2
return l.size() < r.size() 
   || (l.size() == r.size() && l < r);
于 2012-07-03T17:27:42.800 に答える