有没有办法在C++中使用lexicographical_compare()函数对字符串进行排序?
我可以使用STL排序,但我的问题是关于lexicographical_compare()函数。
发布于 2013-05-09 22:05:31
您不需要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";
}发布于 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提供一个比较运算符。例如:
// 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> >类型,并将整数放入其中,但它仍然可以工作。
https://stackoverflow.com/questions/16463008
复制相似问题