是否可以在恒定时间内交换 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调用是否有优势

std::array 中的内存是不是连续?

std::array 是不是有 std::memset 等价物?

变长 std::array 像

编译器生成的默认构造函数是否会将std :: array中的指针初始化为nullptr?