我可以使用std ::分配的分配的原始数组

Can I use std::sort on heap allocated raw arrays?

本文关键字:分配 原始 数组 可以使 我可以 std      更新时间:2023-10-16

我们知道,当使用连续的内存块时,我们可以轻松获得迭代器(此处 &arra[0]arra(,然后将迭代器传递给std :: sort。

例如:

int arra[100];
    for (int i = 0; i < 100; i++) {
        arra[i] = rand() % 32000;
    }
    for (int i = 0; i < len; i++)std::cout << arra[i]<<" ";
    std::sort(arra,arra+100);

现在,如果我有一个分配的阵列,例如,在这里像arr一样:

int len;
    len = 100;
    int* arr = new int[len];
    for (int i = 0; i < len; i++) {
        arr[i] = rand() % 32000;
    }

我不知道我是否可以在此数组中获得迭代器,所以我可以使用std :: sort for这个数组吗?如果没有,是否有使用STD ::在此类数组上进行排序的解决方法?

指针确实符合std::sort所需的RandomAccessIterator标准。只要他们指向相同的(连续(数组,他们是否指向堆叠内存还是堆内存都没关系。因此,您可以简单地使用:

std::sort(arr, arr + len);

这就是说,std::vector可能是在堆上分配数组的更好选择。它将为您节省自己管理内存的头痛。

是的,在两种情况下,您都可以以相同的方式使用std::sortstd::sort都不知道或关心如何分配内存。

在C 库中,迭代器基本上是奇特的指针。因此,仅将指针递增到数组末端以获取"端"指针是符合标准的:

#include<algorithm>
#include<iostream>
int main() {
    int len;
    len = 100;
    int* arr = new int[len];
    for (int i = 0; i < len; i++) {
        arr[i] = rand() % 32000;
    }
    //Valid, Defined Behavior that works as expected
    std::sort(arr, arr + len);
    //alternative, to make the code easier to read:
    //auto begin = arr;
    //auto end = arr + len;
    //std::sort(begin, end);
    for(int i = 0; i < len; i++)
        std::cout << arr[i] << std::endl;
}

但是,一些编译器(例如Visual Studio的编译器(认识到这种代码本质上是不安全的,因为您需要手动提供数组的长度。结果,如果您尝试执行此操作,它们将导致(如果需要的话,可以抑制编译器标志(编译时间错误,并建议您使用编译器提供的实用程序:

#include<algorithm>
#include<iostream>
int main() {
    int len;
    len = 100;
    int* arr = new int[len];
    for (int i = 0; i < len; i++) {
        arr[i] = rand() % 32000;
    }
    //MSVC Specific Code!
    auto begin = stdext::make_checked_array_iterator(arr, len);
    auto end = arr + len;
    std::sort(begin, end);
    for(int i = 0; i < len; i++)
        std::cout << arr[i] << std::endl;
}

有关Visual Studio编译器的此特定快速的更多信息,请参阅此处:https://learn.microsoft.com/en-us/cpp/cppp/candard-library/checked-iterators?view=vs-2019

我可以使用std ::分配的分配的原始数组吗?

是。

我不知道我是否可以在此数组中获得迭代器

你可以。

指向元素的指针是对数组的随机访问迭代器。在自动数组的情况下,该数组名称隐含地衰减到一个指针中,您可以用作迭代器的开始。在动态数组的情况下,new[]的结果已经是指针,即迭代器到阵列的开头。您可以像示例一样使用指针算术来获取指针的指针。

数组变量和有关使用std::sort的动态数组的指针之间的唯一显着差异是,您不能将std::endstd::size与指针一起使用,就像使用数组变量一样。相反,您需要单独了解数组的大小。在这种情况下,您将长度存储在变量len中。