以下数组在C ++代码中给出:
char strings[105][105];
使用operator<
STL
函数编写sort
来对字符串进行排序的正确方法是什么?是否可以?
答案 0 :(得分:4)
该代码实际上看起来像C代码,而不是使用std::string
的C ++。
没有办法编写一个可以与operator<
一起使用的std::sort
,因为除非你写那个TOO,否则没有交换可以正常工作。
使用std::string
会使这变得非常简单,否则您将不得不编写自己的operator<
(查看C函数strcmp
)和swap
函数。< / p>
编辑:请注意,交换std::string
几乎肯定比在char
数组中交换大量内存更快。
答案 1 :(得分:3)
无法编写operator<
来处理char
数组。
答案 2 :(得分:2)
假设你真的做需要按行排序2D数组,那么std::sort()
为你做这件事有点困难,即使给出了一个有效的比较器函数:它还需要某种迭代器适配器。
但是,您可以轻松使用其他就地排序算法,例如选择排序:
#include <iostream>
#include <algorithm>
#include <string>
template<int N>
bool char_array_less(const char(&l)[N], const char(&r)[N])
{
return std::char_traits<char>::compare(&l[0], &r[0], N) < 0;
// for a more general solution
// return std::lexicographical_compare(&l[0], &l[0]+N, &r[0], &r[0]+N);
}
template<int N>
void swap_char_arrays( char(*l)[N], char(*r)[N])
{
std::swap_ranges(&(*l)[0], &(*l)[0]+N, &(*r)[0]);
}
const int ROWS = 105;
const int COLS = 105;
int main()
{
char a[ROWS][COLS] = {"foo", "bar", "whatever" };
for(char(*i)[COLS] = a; i != a+ROWS; ++i)
swap_char_arrays(i,
std::min_element(i, a+ROWS, char_array_less<COLS>));
for(int i=0; i<ROWS; ++i)
std::cout << a[i] << '\n';
}
答案 3 :(得分:1)
你不能为指针重载operator<
,但你不需要,因为std :: sort可以接受任何比较函数(或函子)。
另一个问题是排序算法无法交换数组,因为它们不可分配。但是你可以将一个指针数组排序到二维数组中(保留原始数组)。
#include <algorithm>
#include <cstring>
#include <cstdio>
bool compare_cstring(const char* a, const char* b)
{
return strcmp(a, b) < 0;
}
int main()
{
const int count = 5;
char strings[count][10] = { "One", "Two", "Three", "Four", "Five" };
char* sorted_view[count];
for (int i = 0; i != count; ++i) {
sorted_view[i] = strings[i];
}
std::sort(sorted_view, sorted_view + count, compare_cstring);
for (int i = 0; i != count; ++i) {
puts(sorted_view[i]);
}
}