使用operator<在C ++中对字符串进行排序

时间:2011-03-31 20:37:56

标签: c++ string sorting stl operators

以下数组在C ++代码中给出:

char strings[105][105];

使用operator< STL函数编写sort来对字符串进行排序的正确方法是什么?是否可以?

4 个答案:

答案 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';
}

测试运行:https://ideone.com/15hRB

答案 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]);
    }
}