首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sort by lexicographical_compare()函数

Sort by lexicographical_compare()函数
EN

Stack Overflow用户
提问于 2013-05-09 21:30:16
回答 2查看 15.4K关注 0票数 1

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-05-09 22:05:31

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

代码语言:javascript
复制
#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";
}

这同样适用于对字符串集合进行排序:

代码语言:javascript
复制
#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";
}
票数 6
EN

Stack Overflow用户

发布于 2015-01-30 06:41:46

这个问题用词不当。当然,std::lexicographical_compare不会修改任何东西,所以要进行排序不能只使用std::lexicographical_compare:您必须以某种方式使用std::sort (或等效的)。“如何按字典顺序对std::strings的容器进行排序”的正确答案是std::sort(vec.begin(), vec.end()),因为operator< on std::strings是字典序比较。

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

代码语言:javascript
复制
// 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> >类型,并将整数放入其中,但它仍然可以工作。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16463008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档