按lexicographical_compare()函数排序

时间:2013-05-09 13:30:16

标签: c++ sorting

有没有办法使用C ++中的lexicographical_compare()函数对字符串进行排序?

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

2 个答案:

答案 0 :(得分:5)

您不需要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";
}

答案 1 :(得分:5)

这个问题措辞不力。当然,std::lexicographical_compare并未对任何内容进行修改,因此要排序,您只能使用std::lexicographical_compare:您必须以某种方式使用std::sort(或等效内容)。正确答案&#34;您如何按字母顺序对std::string的容器进行排序std::sort(vec.begin(), vec.end()),因为operator<上的std::string是词典比较。

假设您的问题是一个更广泛问题的示例,您将如何将容器范围排序为字典顺序(这实际上更像是如何使用自定义比较函数对象来改变{的行为? {1}}),您只需向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并将整数推回到它们中,它仍然有用。