Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交换两个std::array<;T、 100>;物体?_C++_Arrays - Fatal编程技术网

C++ 交换两个std::array<;T、 100>;物体?

C++ 交换两个std::array<;T、 100>;物体?,c++,arrays,C++,Arrays,我设想std::vector的内部是一对指针,指向占用内存的开始和结束,以及一个整数,指定属于该向量的内存数组的长度。因此,交换相同大小的两个向量只需交换内置类型的3 然而,我几乎从不使用std::array,因此我不知道如何想象它的内部结构。直观地说,由于编译器已经知道数组的大小,因此不需要存储数组的结尾或预分配内存的大小,因此其内部应该只有一个指针。因此,成本应仅为1个内置类型交换 相反,文件上说,成本很高。为什么会这样?因为数组不是指针。它实际上是n个内联值。std::array不会在其他

我设想
std::vector
的内部是一对指针,指向占用内存的开始和结束,以及一个整数,指定属于该向量的内存数组的长度。因此,交换相同大小的两个向量只需交换内置类型的3

然而,我几乎从不使用std::array,因此我不知道如何想象它的内部结构。直观地说,由于编译器已经知道数组的大小,因此不需要存储数组的结尾或预分配内存的大小,因此其内部应该只有一个指针。因此,成本应仅为1个内置类型交换


相反,文件上说,成本很高。为什么会这样?

因为数组不是指针。它实际上是n个内联值。
std::array
不会在其他位置为N个对象分配空间,而是为N个对象分配空间,就好像它只有成员
value1、value2、value3、
时才保证没有填充(这允许索引)。您正在考虑的是迄今为止假设的
std::dynarray
。这两个对象:

std::array<T, 100> a;
std::dynarray<T> b;

因为数组不是指针。它实际上是n个内联值。
std::array
不会在其他位置为N个对象分配空间,而是为N个对象分配空间,就好像它只有成员
value1、value2、value3、
时才保证没有填充(这允许索引)。您正在考虑的是迄今为止假设的
std::dynarray
。这两个对象:

std::array<T, 100> a;
std::dynarray<T> b;
因此,成本应仅为1个内置类型交换。相反,文件中说,成本在要素数量上是线性的。为什么会这样

因为C样式数组和
std::array
的复杂性只是C样式数组的包装。直观地看,这是显而易见的:您必须相互交换数组的每个元素


我将std::vector的内部想象为一对指针,指向占用内存的开始和结束,以及一个整数,指定属于该向量的内存数组的长度

嗯,也许吧。有些实现只存储指向动态分配数组的指针、std::size_t成员和容量的整数值(无需存储指向数组末尾的指针,因为它可以通过
begin+size
轻松检索),当调用
push_back
end
时,指针算法的开销。其他实现在调用
size
时存储两个指向开始和结束的指针(如您所说),代价是
end-begin

直观地说,由于编译器已经知道数组的大小,因此不需要存储数组的结尾或预分配内存的大小,因此其内部应该只有一个指针

不,std::array类只是“一种聚合类型,其语义与将C样式数组
T[N]
作为其唯一非静态数据成员的结构相同”

因此,成本应仅为1个内置类型交换。相反,文件中说,成本在要素数量上是线性的。为什么会这样

因为C样式数组和
std::array
的复杂性只是C样式数组的包装。直观地看,这是显而易见的:您必须相互交换数组的每个元素


我将std::vector的内部想象为一对指针,指向占用内存的开始和结束,以及一个整数,指定属于该向量的内存数组的长度

嗯,也许吧。有些实现只存储指向动态分配数组的指针、std::size_t成员和容量的整数值(无需存储指向数组末尾的指针,因为它可以通过
begin+size
轻松检索),当调用
push_back
end
时,指针算法的开销。其他实现在调用
size
时存储两个指向开始和结束的指针(如您所说),代价是
end-begin

直观地说,由于编译器已经知道数组的大小,因此不需要存储数组的结尾或预分配内存的大小,因此其内部应该只有一个指针


不,std::array类只是“一种聚合类型,其语义与将C样式数组
T[N]
作为其唯一非静态数据成员的结构相同”。

std::array
是围绕原始数组的模板。所以,是的,交换是O(N),除非你
新建它,否则它将在堆栈上,所以交换将涉及memcpy,这将是O(N)。@Borgleader如果你做
新建std::array
?;-)@delnan那么您的变量是指向数组的指针…:P我意识到我应该说原始数组。让我来解决这个问题。
std::array
是一个围绕原始数组的模板。所以,是的,交换是O(N),除非你
新建它,否则它将在堆栈上,所以交换将涉及memcpy,这将是O(N)。@Borgleader如果你做
新建std::array
?;-)@delnan那么您的变量是指向数组的指针…:P我意识到我应该说原始数组。让我来解决这个问题。那么编译器会记住这些n个值中每一个值的地址吗?@MartinDrozdik它通常只是对n个值作为一个整体进行推理,因为
i
th元素的地址用指针算法很难找到(而且编译器也不感兴趣).是否有什么东西禁止编译器在固定时间内交换这两个结构?如果只使用一个指针来实现
std::array
,是否会失去一些优势?因此,如果我想要一个数组,我知道它的长度是co