我可以使用std ::分配的分配的原始数组
Can I use std::sort on heap allocated raw arrays?
我们知道,当使用连续的内存块时,我们可以轻松获得迭代器(此处 &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::sort
,std::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::end
或std::size
与指针一起使用,就像使用数组变量一样。相反,您需要单独了解数组的大小。在这种情况下,您将长度存储在变量len
中。
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何在C++中将类的实例完全重新分配给同一类的另一个实例(然后删除原始对象)?
- C 为什么在原始双阵列中的分配似乎比双变量分配要快得多
- 我可以使用std ::分配的分配的原始数组
- 好的设计?用于分配的智能指针与用于访问的原始指针相结合
- 为什么我不能在分配中将unique_ptr转换为原始指针
- 使用原始数据OpenCV设置已分配的Mat
- 移动是否分配了 std::fstream 关闭原始流
- 使用这样的'delete'会释放原始分配的内存吗?
- 原始缓冲区的分配/损坏-如何进行调试
- Try/catch块用于在构造函数内部将简单内存分配到公共原始指针
- 为什么std::vector可能比原始动态分配的数组快?
- 我可以使用std::向量作为预分配(原始)数组的门面吗
- 在循环中分配的原始数据类型的次数