按lexicographical_compare()函数排序

Sort by lexicographical_compare() function

本文关键字:函数 排序 compare lexicographical      更新时间:2023-10-16

是否有任何方法使用lexicographical_compare()函数在c++中排序字符串?

我可以通过STL排序,但我的问题是关于lexicographical_compare()函数。

这个问题措辞不好。当然,std::lexicographical_compare不修改任何东西,所以排序你不能只用std::lexicographical_compare:你必须以某种方式使用std::sort(或同等)。对于"如何按字典顺序对std::string s的容器进行排序"的正确答案是std::sort(vec.begin(), vec.end()),因为std::string s上的operator<是按字典顺序比较的。

假设您的问题是如何将容器范围按字典顺序排序的更广泛问题的示例(这实际上更多的是如何使用自定义比较函数对象来改变std::sort的行为的问题),您只需为std::sort提供比较操作符。例如:

// A function objecto to do lexicographical comparisons
template <typename Container>
bool LexCompare(const Container& a, const Container& b) {
    return std::lexicographical_compare(a.begin(), a.end(),
                                        b.begin(), b.end());
}
// Use that comparison function to sort a range:
template <typename ContainerIterator>
void sort_by_lexicographical_comapre(ContainerIterator beg,
                                     ContainerIterator end)
{
    std::sort(beg, end, LexCompare<typename ContainerIterator::value_type>);
}

int main() {
    std::vector<std::string> v;
    v.push_back(std::string());
    v[0].push_back('1');
    v[0].push_back('3');
    v[0].push_back('0');
    v.push_back(std::string());
    v[1].push_back('1');
    v[1].push_back('3');
    sort_by_lexicographical_comapre(v.begin(), v.end());
    for (int i = 0; i != v.size(); ++i) {
        std::cout << v[i] << "n";
    }
    return 0;
}

你可以改变上面的v类型为std::vector<std::vector<int> >,并将整数推入它们,它仍然可以工作

您不需要std::lexicographical_compare来排序字符串。你只需要std::sort算法:

#include <iostream>
#include <string>
#include <algorithm>
int main()
{
  std::string s("qwertyuioplkjhgfdsazxcvbnm");
  std::cout << s << "n";
  std::sort(s.begin(), s.end());
  std::cout << s << "n";
}

同样适用于字符串集合的排序:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int main()
{
  std::vector<std::string> v{"apple" , "Apple" ,"AppLe" , "APPLe"};
  for (const auto& s : v)
    std::cout << s << " ";
  std::cout << "n";
  std::sort(v.begin(), v.end());
  for (const auto& s : v)
    std::cout << s << " ";
  std::cout << "n";
}