【问题标题】:std::map ordering predicate to order by string size but keep different strings?std::map 排序谓词按字符串大小排序但保留不同的字符串?
【发布时间】:2012-07-03 17:22:50
【问题描述】:

我需要在地图中存储各种字符串,但我想让它们按大小排序。

使用这样的谓词:

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

【问题讨论】:

  • 不丢弃相等的键听起来更像是multimap
  • 您可以使用比较运算符,将尺寸作为第一条件,将实际内容作为匹配尺寸的第二条件。

标签: c++ stl map predicate


【解决方案1】:

在比较器中比较大小和字符串:

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);
    };
};

【讨论】:

  • 可以将第一部分改写为if (l.size() != r.size()) return l.size() &lt; r.size();
  • @templatetypedef:是的。在编写关系比较器时,我更喜欢使用关系运算符(而不是使用相等运算符)。我还认为代码写得更清晰:我已经调试了足够多不正确的严格-弱排序,我认为最好遵循一个通用模式,这样可以清楚地表明代码是正确的。
  • 我建议使用std::tie,而不是将字符串复制到一个元组中以进行比较。
【解决方案2】:
return l.size() < r.size() 
   || (l.size() == r.size() && l < r);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2019-08-12
    相关资源
    最近更新 更多