【问题标题】:How to sort std::array with std::sort? [closed]如何使用 std::sort 对 std::array 进行排序? [关闭]
【发布时间】:2016-09-11 10:21:00
【问题描述】:
#include <iostream>
#include <array>
#include <algorithm>
#include <cstring>

using namespace std;

int main() {
    array<char, 20> test{"HelloWorld"}, tmp;

    // method 1
    tmp = test;
    sort(tmp.begin(), tmp.begin() + strlen(tmp.begin()));
    cout << "result: " << tmp.data() << endl;

    // method 2
    tmp = test;
    sort(tmp.begin(), tmp.end());
    cout << "result: " << tmp.data() << endl;

    return 0;
}

std::array可以用方法1排序,但是太丑了。

我更喜欢方法2,但是什么都不能返回。它有什么问题?

【问题讨论】:

  • 两个sort 调用做不同的事情。使用能满足您需求的那个。
  • 这里的根本问题是您试图让std::array 成为std::string。事实并非如此,并且尝试将其用作一个永远不会很好地工作。
  • 你为什么不用std::string?那么方法 2 就可以了。
  • end() 指向数组范围之外,begin()+strlen(...) 指向实际字符串的末尾。

标签: c++ arrays sorting c++11 stl


【解决方案1】:

第二种方法是将所有\0元素排序到前面。 (他们比其他任何角色都少。

当您尝试使用 .data() 打印它时,您会得到一个 char const* 对象,流类将其视为 C 字符串。这是一个以空结尾的字符串。由于第一个字符为空,因此不打印任何内容。

你可以修复

    auto cmp = [](char a, char b) { return a != '\0' && a<b; }
    sort(tmp.begin(), tmp.end(), cmp);

这使用了一个比较器,它在最后对\0 进行排序。

但正如 Jerry Coffin 在 cmets 中所说,std::array 不是 std::string - 使用适合您需要的那个(在这种情况下可能是 std::string)。

【讨论】:

  • @LokiAstari:感谢您的加入 - 好多了。
【解决方案2】:

您正在打印一个 C 字符串,它依赖于是否存在终止空字符:\0
当您对整个数组进行排序时,您将该空字符移到前面,这会告诉您的打印函数它是一个空字符串。

因此,您别无选择,只能使用更丑的版本。话虽如此,这是一种更安全的编写方式,您可能更喜欢:

sort(tmp.begin(), find(tmp.begin(), tmp.end(), '\0'));

【讨论】:

  • 不知道这样更干净。
  • @BenjaminLindley tmp.begin() + strlen(tmp.begin()) 做了额外的工作。
  • 那是什么作品?如果我不得不猜测哪个工作更多,那将是您的版本,因为它需要比较迭代器本身的值(与结束迭代器),以及取消引用的值(与 0)。而strlen 仅检查取消引用的值。
  • @Ben 我想是这样,我没想到要考虑这一点。我还是更喜欢这个版本,所以我只是修改我的措辞。
  • 您的一个优势确实是它更安全。
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
相关资源
最近更新 更多