是否可以在恒定时间内交换 std::array ?
Posted
技术标签:
【中文标题】是否可以在恒定时间内交换 std::array ?【英文标题】:Is it possible to swap std::array in constant time? 【发布时间】:2021-08-18 06:02:41 【问题描述】:据我了解,交换 std::vector
是一个恒定时间操作,因为交换了唯一的指针,但在 std::array
的情况下,交换是元素方面的。是否可以交换std::array
的指针?
抱歉,如果这已经被问死了。如果是这样,请指出我正确的方向,谢谢。
【问题讨论】:
std::array
首先没有任何指针。它只是一个 C 样式数组的包装器
您当然可以使用两个指向两个数组实例的std::array
指针,并交换这些指针。对于您尝试实现的算法,这可能不够好,也可能不够好。
如果一个数组包含指针或其他普通类型的元素,则可以使用 memcpy()、优化的 std::copy() 等在恒定时间内将它们复制到另一个数组。但非-平凡的类型不能。如果要交换 2 个数组的元素,则必须单独交换它们。
@RemyLebeau:就数组中的条目数而言,这不是恒定的时间。
【参考方案1】:
您可以将std::vector
视为沿着这些思路
template<typename T>
struct vector
T * pointer;
int N; // well, not really int
// the several constructors allocate memory, set N, and do other stuff if necessary
// Other stuff
;
所以有你引用的指针,当你交换两个向量时交换的那个。
但是std::array
更像这样
template<typename T, int N> // again, not really int
struct array
T elements[N];
// other stuff
;
所以这里没有指针,只是静态分配的内存。
(学习here。)
【讨论】:
【参考方案2】:没有“std::array
的指针”。 array
是它的内容;它只指向具有int
成员“指向”该成员的类。
【讨论】:
以上是关于是否可以在恒定时间内交换 std::array ?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 begin() 和 end() 创建 std::array?
通过在堆栈上传递std :: array进行API调用是否有优势