用c ++排序字符串向量

时间:2017-12-17 04:21:55

标签: string vector

我正在编写c ++来对字符串向量进行排序。字符串应按其长度排序。如果长度相同,则按字典顺序排序:例如:abc< ABD 这是我的代码:

static bool sort_find(string& a, string& b){
         if(a.size() < b.size()){
             return true;
         }
         else if(a.size() > b.size()){
             return false;
         }
         else{
             for(int i=0;i<a.size();i++){
                if(a[i] ==  b[i] )
                  continue;
                 else if(a[i] < b[i]){
                    return true;
                  }
                 else{
                   return false;
                }
             }
             return true;
         }
     }

int main(){

 string array[13]={"m","mo","moc","moch","mocha","l","la","lat","latt","latte","c","ca","cat"};

 vector<string> svector(array,array+13);
 sort(svector.begin(),svector.end(),sort_find);
 return 0;
}

此代码的输出是[c,l,m,ca,la,moch,mo,cat,lat,moc,latt,mocha,latte]输出对我没有意义。

欢迎每个人的帮助!!

谢谢!

1 个答案:

答案 0 :(得分:1)

起初,我觉得很好。它对我有用。但那是纯粹的运气。

如果你查找std :: sort,并按照比较函数的要求链接到http://en.cppreference.com/w/cpp/concept/Compare,你会发现它必须是一个严格的弱排序,包括要求

对于所有a,comp(a,a)== false

如果两个字符串相同,则返回true。这没有意义,因为你真的定义了less运算符。这导致了std算法和数据结构的意外行为,这些算法和数据结构期望严格的弱排序。

为了解决这个问题,我建议如果长度相同,你只需返回一个&lt; b,因为std :: string已经有了词典比较。

bool compare_length_then_string_lt(const string& a, const string& b) {
    if (a.size() < b.size())
        return true;
    else if (a.size() > b.size())
        return false;
    else
        return a < b;
}

std::sort(svector.begin(), svector.end(), compare_length_then_string_lt);

但我差点忘了。当组合多种不同的方式来比较两个结构时,通常可以使用std :: tuple或std :: tie,它们已经知道如何正确地将比较链接在一起。您只需告诉他们要按什么顺序比较哪些组件,他们会处理其余的事情:

std::sort(svector.begin(), svector.end(),
    // lambda notation
    [](const std::string &lhs, const std::string &rhs) {
        // comparator body
        return std::make_tuple(lhs.size(), lhs) < std::make_tuple(rhs.size(), rhs);
    }
);