如何使用 std::sort 和 std::array?[复制]

How to use std::sort with an std::array? [duplicate]

提问人:all_caps 提问时间:8/15/2023 最后编辑:LoSall_caps 更新时间:9/26/2023 访问量:143

问:

我需要对 进行排序,但我无法弄清楚如何使用该函数来做到这一点,因为我收到错误“没有重载函数排序的实例与参数列表匹配”和“没有运算符'+'与这些操作数匹配”。当我使用相同的语法尝试对常规数组进行排序时,我没有错误。 以下是产生问题的代码:std::arraystd::sort()

#include <algorithm>
#include <array>

int nums[5] = {1, 2, 3, 4, 5};
std::array<int, 5> morenums = {1, 2, 3, 4, 5};


int main(){
    std::sort(nums, nums + 5);//no error
    std::sort(morenums, morenums + 5);//error    
}

我试图使用该方法对 进行排序,但我不知道该怎么做,因为我不断收到错误。std::sort()std::array

C++ 排序 stdarray

评论

2赞 G.M. 8/15/2023
请参阅 std::sort 文档
2赞 molbdnilo 8/15/2023
你可以通过阅读 std::array 来解决这个问题,而不是猜测和假设。
2赞 Peter 8/15/2023
在所有 C++ 标准中,都可以工作,因为所有标准库容器都具有 和 成员函数。C++ 11 及更高版本,还有 和 它们适用于原始数组和标准容器,因此您可以将 ur 的主体替换为 - 除其他外,这避免了对 参数中的值进行硬编码的需要。std::sort(morenums.begin(), morenums.end())begin()end()std::begin()std::end()main()std::sort(std::begin(nums), std::end(nums)); std::sort(std::begin(morenums), std::end(morenums));5std::sort()
0赞 fabian 8/16/2023
std::array不会衰减到指针(或其他类型的迭代器。您需要使用迭代器。与使用数组的代码最接近的等价物是 ,但我更喜欢这里提出的其他建议......(从技术上讲,可能更接近第一次调用,但我肯定会避免那个版本......std::sort(morenums.begin(), morenums.begin() + 5);std::sort(morenums.data(), morenums.data() + 5);std::sort

答:

9赞 HolyBlackCat 8/15/2023 #1

与对任何其他容器进行排序相同,例如:std::vector

std::sort(morenums.begin(), morenums.end());

是普通数组具有奇怪的语法,而不是 .std::array

你也可以做 或 ,它们适用于普通数组和容器。std::sort(std::begin(morenums), std::end(morenums));std::ranges::sort(morenums);

3赞 Joel 8/15/2023 #2

std::sort()事实上,STL 中的许多其他算法都使用了迭代器。迭代器是至少可以取消引用 () 和 increment() 的类,它们通常指向一系列元素中的元素。它们可以指向无效元素,例如 a 或其他 STL 容器的方法(它指向最后一个有效元素之后的元素)。*++.end()std::array

迭代器的最基本形式是原始指针,它支持增量、取消引用以及您使用的指针算术。在您的示例中,它只是一个 c 样式的数组,它可以衰减为指向其第一个元素的指针。int nums[5]

因此,与做相同的操作,即成为远的一个元素,但这没关系,因为它不会被取消引用,并且正是预期的。std::sort(nums, nums + 5)std::sort(&nums[0], &nums[5])nums[5]std::sort()

但是不起作用,因为是一个普通的类(不是迭代器),不会衰减为指针,并且您不能使用它进行加法。但是,自 和 自带了方法,它们正好返回 所需的两个迭代器(或更复杂的指针)。 指向第一个有效元素 (),然后再次指向最后一个有效元素之后的下一个元素。使用这些迭代器,您无需像使用 c 样式数组那样关心 的大小。std::sort(morenums, morenums + 5)morenumsstd::array.begin().end()std::sort().begin()morenums[0].end()std::array

你也可以用它来排序你的,这将使用指针而不是迭代器类,但这只是为了演示,与你对 c 样式数组所做的相同。但是,您不应该在实际代码中使用它,而只需使用 .这种使用指针的方法适用于 ,因为所有元素都是按顺序排列的,每个元素都位于下一个内存位置,但它可能不适用于不将元素存储在一个连续内存块中的其他容器。std::sort(&morenums[0], &morenums[0] + morenums.size())std::arraystd::arraystd::array


要使您的示例正常工作,您可以更改尝试对 to 进行排序的行,您的工作代码将如下所示:std::arraystd::sort(morenums.begin(), morenums.end());

#include <array>
#include <algorithm>

int nums[5] = { 5, 2, 3, 4, 1 };
std::array<int, 5> morenums = { 1, 2, 5, 4, 3 };


int main() {
    std::sort(nums, nums + 5);
    std::sort(morenums.begin(), morenums.end()); 

    return 0;
}

评论

0赞 Vivick 8/15/2023
这两个示例都应该是,并且作为 free 函数,可以处理您访问迭代器/数据的各种方式,并帮助使代码更加通用std::sort(std::begin(nums), std::end(nums))std::sort(std::begin(morenums), std::end(morenums))
1赞 Joel 8/15/2023
@Vivick 使用 or 到底有什么区别?我一直以为那些人会以同样的方式行事?是的,我可以将它们用于 c 样式数组,但我不想这样做,因为有人可能想将数组传递给函数,然后无法在衰减的指针上工作。std::begin().begin()std::begin()
1赞 Toby Speight 8/15/2023
std::begin()并且同样适用于普通数组,因此它们在模板函数中是首选(实际上,在模板中,将它们作为参数相关查找的后备:std::end()usingusing std::begin; using std::end; std::sort(begin(a), end(a));