提问人:all_caps 提问时间:8/15/2023 最后编辑:LoSall_caps 更新时间:9/26/2023 访问量:143
如何使用 std::sort 和 std::array?[复制]
How to use std::sort with an std::array? [duplicate]
问:
我需要对 进行排序,但我无法弄清楚如何使用该函数来做到这一点,因为我收到错误“没有重载函数排序的实例与参数列表匹配”和“没有运算符'+'与这些操作数匹配”。当我使用相同的语法尝试对常规数组进行排序时,我没有错误。
以下是产生问题的代码:std::array
std::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
答:
与对任何其他容器进行排序相同,例如:std::vector
std::sort(morenums.begin(), morenums.end());
是普通数组具有奇怪的语法,而不是 .std::array
你也可以做 或 ,它们适用于普通数组和容器。std::sort(std::begin(morenums), std::end(morenums));
std::ranges::sort(morenums);
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)
morenums
std::array
.begin()
.end()
std::sort()
.begin()
morenums[0]
.end()
std::array
你也可以用它来排序你的,这将使用指针而不是迭代器类,但这只是为了演示,与你对 c 样式数组所做的相同。但是,您不应该在实际代码中使用它,而只需使用 .这种使用指针的方法适用于 ,因为所有元素都是按顺序排列的,每个元素都位于下一个内存位置,但它可能不适用于不将元素存储在一个连续内存块中的其他容器。std::sort(&morenums[0], &morenums[0] + morenums.size())
std::array
std::array
std::array
要使您的示例正常工作,您可以更改尝试对 to 进行排序的行,您的工作代码将如下所示:std::array
std::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;
}
评论
std::sort(std::begin(nums), std::end(nums))
std::sort(std::begin(morenums), std::end(morenums))
std::begin()
.begin()
std::begin()
std::begin()
并且同样适用于普通数组,因此它们在模板函数中是首选(实际上,在模板中,将它们作为参数相关查找的后备:std::end()
using
using std::begin; using std::end; std::sort(begin(a), end(a));
评论
std::sort
文档。std::array
来解决这个问题,而不是猜测和假设。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));
5
std::sort()
std::array
不会衰减到指针(或其他类型的迭代器。您需要使用迭代器。与使用数组的代码最接近的等价物是 ,但我更喜欢这里提出的其他建议......(从技术上讲,可能更接近第一次调用,但我肯定会避免那个版本......std::sort(morenums.begin(), morenums.begin() + 5);
std::sort(morenums.data(), morenums.data() + 5);
std::sort