【问题标题】:Sorting array of strings in cpp using std:sort使用 std:sort 对 cpp 中的字符串数组进行排序
【发布时间】:2021-01-13 03:42:07
【问题描述】:

我正在尝试按照this one 等网站的一些建议对字符串数组(是的,不是向量)进行排序。这是我到目前为止写的代码,但它总是打印出this long 错误(在谷歌上没有结果)。如何解决这个问题?

#include <algorithm>
#include <cstring>
#include <iostream>
//qsort(names, n, 15, (int (*)(const void *, const void *))strcmp);



int main()
{
    std::cout << "hi";
    char arr[3][6];
    strcpy(arr[0], "hello"), strcpy(arr[1], "hillo"), strcpy(arr[2], "hallo");
    std::sort(arr, arr + 3, [](char const *lhs,
                           char const *rhs) { return strcmp(lhs, rhs) < 0; });
    //qsort(arr, 3, 20, (int (*)(const void *, const void *))strcmp);
    for (int i = 0; i < 3; ++i)
        std::cout << arr[i] << '\n';
}

【问题讨论】:

  • 这能回答你的问题吗? C++ String array sorting
  • 考虑您要排序的数组的元素类型。数组是不可分配的,因此用于交换数组中的行(每个元素实际上是一个 char 数组)的库存交换机制将不起作用。
  • @WhozCraig 你想说的是我有一个数组数组(字符串是数组),由于数组不可分配,我们不能交换“排序”的项目吗?那么其他 SO 问题的人是如何做到的呢?
  • 差不多。扔掉你的 arr 声明和 strcpy 调用,并用 const char *arr[] = { "hello", "hillo", "hallo" }; 替换它们,然后重试。然后考虑发生了什么变化以及为什么它现在有效。
  • @WhozCraig 会在这里使用“字符串”类型吗? (而不是做一个二维数组做一个一维数组,每个元素都具有字符串类型)

标签: c++ arrays string sorting


【解决方案1】:

这是错误信息的相关部分:

错误:数组必须用大括号括起来的初始化器进行初始化

不幸的是,这不是很清楚,但不是来自排序实现。那么,让我们修改一下算法的前提条件:

std::sort 是通过交换元素来实现的。因此,它要求元素是可交换的。数组的元素是数组。数组不可交换。因此数组数组是不可排序的。

在这里使用“字符串”类型有用吗?

使用std::string 会起作用。它是可交换的。您甚至不需要自定义比较函数,因为它甚至具有可比性。

是什么使数组不可交换而其他类型可交换

交换由移动初始化(和分配)实现。语言规则说数组不可移动初始化(也不可分配)。知道了这一点,看看错误信息是否有意义。

【讨论】:

  • 谢谢。是什么让数组不可交换而其他类型可交换?
  • 很有趣,我会继续探索这个主题以加深理解。谢谢。我会将您的答案标记为正确,并会提到@WhozCraig 的 cmets 非常具有解释性。
【解决方案2】:

您不能使用 sort 内置函数对数组数组进行排序。 您可以遍历字符串数组并使用sort(str.begin(), str.end())对每个字符串(str)进行排序。

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多