2013-05-14 54 views
-2

我使用std ::地图在C++中,它的排序按字母方向键,这样的:由第一字符的排序字符串

AAA, AA0, AA1, AAB, AC1 = AA0->AA1->AAA->AAB->AC1

但我想给它以不同的方式进行排序:

AAA, AA0, AA1, AAB, AC1 = AAA->AAB->AA0->AA1->AC1

如何为std :: map编写比较类,这将解决我的问题? 我完全不知道该怎么做。 这是我比较类的定义:

struct Comp 
{ 
    bool operator()(const std::string& lhs, const std::string& rhs) const 
    { 
     //dont know what should I write here 
    }; 
}; 
+4

我觉得@juanchopanza故意留下,作为你的锻炼。 :P还值得指出的是,如果你想经常处理这样的字符串,最好提供一个用户定义的'char_traits'。 – 2013-05-14 14:26:01

+0

第二顺序是什么意思?你能用一个很好的算法来描述它吗? – deepmax 2013-05-14 14:28:31

+2

首先以明文形式编写算法,然后将这些单词翻译为代码。 IOW没有一个明确的定义(不仅仅是例子),你不能希望编码任何东西。有了它,它通常很简单。 – Angew 2013-05-14 14:29:10

回答

3

如果我理解正确的,你真正想要的是数字 字母字符之后进行排序。只要你能 恢复排序标准下降到字母的排序, 你可以使用std::lexicographical_compare,通过它 比较运算符,它可以做你需要的 字符。

我通常在一个比较运营商结合起来的:

struct Comp 
{ 
    bool isDigit(char lhs) const 
    { 
     return ::isdigit(static_cast<unsigned char>(lhs)); 
    } 

    bool operator()(char lhs, char rhs) const 
    { 
     return isDigit(lhs) == isDigit(rhs) 
      ? lhs < rhs 
      : isDigit(rhs); 
    } 

    bool operator()(std::string const& lhs, std::string const& rhs) const 
    { 
     return std::lexicographical_compare(
      lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), *this); 
    } 
}; 

对于更广义的比较,您可以提供地图 值的比较,并使用它:

bool Comp::operator()(char lhs, char rhs) const 
{ 
    return myMap[ static_cast<unsigned char>(lhs) ] 
     < myMap[ static_cast<unsigned char>(rhs) ]; 
} 

这将允许任何可想象的排序,只要可以逐个字符地完成排序 即可。

+0

谢谢你的帮助。 Visual Studio说,'std :: lexicographical_compare(lhs,rhs,* this);'给出的参数太少(期望4或5个参数)。 – 2013-05-14 14:47:24

+0

@ user2342783对不起。当然,它需要迭代器,而不是字符串。我会解决它。 – 2013-05-14 14:48:05

+0

非常感谢!我保证,我会学习如何使用它,没有其他人的帮助:)! – 2013-05-14 14:49:54