当前位置: 首页 > 知识库问答 >
问题:

constd::array与std::array的区别

程钧
2023-03-14

std::array有什么实际区别吗

看起来包含常量元素的非常量数组仍然无法交换;赋值运算符也不工作。

什么时候我应该选择一个而不是另一个?

#include <array>

std::array<const int, 5> array_of_const = {1,2,3,4,5};
std::array<const int, 5> array_of_const2 = {1,2,3,4,5};

const std::array<int, 5> const_array = {1,2,3,4,5};
const std::array<int, 5> const_array2 = {1,2,3,4,5};

int main()
{
    // Assignment doesn't work for either
    array_of_const = array_of_const2;
    const_array = const_array2;

    // Swapping doesn't work for either
    array_of_const.swap(array_of_const2);
    const_array.swap(const_array2);

    // Indexing...
    array_of_const[0] = 0;
    const_array[0] = 0;

    return 0;
};

共有3个答案

华衡
2023-03-14

当您需要将变量传递给其他函数时,可能至少有一种差异情况,例如:

#include <array>

std::array<const int, 5> cc_arr5 = {1,2,3,4,5};
const std::array<int, 5> cc_arr5_2 = {1,2,3,4,5};

template<class T, std::size_t N>
void func(std::array<T, N>& a) {
    // do not change a, for example just calculate sum
}

int main()
{
    func(cc_arr5);
    func(cc_arr5_2); // this line does not compile

    return 0;
};
汪才
2023-03-14

std::数组的副本

它们匹配的模板存在差异,例如伊利亚回答中的案例。

蒲坚
2023-03-14

它们确实是不同的类型,因此您不能在一个地方使用其中一个,而不管另一个是预期的,例如在函数调用或赋值中。

也就是说,由于数组是一个固定大小的容器,没有辅助数据成员,因此让容器常量阻止对其元素的任何更改,而让元素常量不允许对容器进行任何更改,因为它显然没有其他数据成员。

不同地说,这两种类型将具有非常相同的有效和无效操作。

我能想到的主要区别是const_cast含义:数组可以(隐式地)转换为相同元素类型的const数组,但不能转换为const修改类型的数组:

std::array<int, 3> a {1, 2, 3};

std::array<const int, 3> b = a; // Error: no known conversion from 'array<int, [...]>' to 'const array<const int, [...]>
const std::array<int, 3> c = a; // Ok
 类似资料:
  • 两者之间有实际区别吗 和 ? 看起来包含常量元素的非常量数组仍然无法交换,赋值运算符也不起作用<我什么时候应该选择一个而不是另一个?

  • 问题内容: 之间有什么区别(如果有) 和 我应该使用哪一个? 问题答案: 该规范说: 当作为函数而不是构造函数调用时,它将创建并初始化一个新的Array对象。因此,函数调用等效于具有相同参数的对象创建表达式。

  • 如何创建包含以下值f(0),f(1),…,f(N-1)的const std::数组,其中f是任何函数:静态constexpr size_t f(int index)?当我确切地知道N时,我显然可以写

  • 问题内容: 作者:霖呆呆 Array(3)和Array(3, 4)的区别? 考察知识点: 和 参数个数不同时的不同表现 的作用 问题答案: Array和new Array的执行结果一样 Array(3) => [empty x3] 一个参数的时候创建一个长度为3的空数组 Array(3, 4) => [3, 4] 大于一个参数的时候则把参数作为元素创建一个长度可变数组 Array.of(3) =>

  • 我试图创建一个查找表,以便轻松创建具有不同值的对象。为此,我需要在类中使用一个静态std::数组填充数据。目前看起来是这样的: 它工作正常,如果我删除std::字符串,但与std::字符串我得到编译错误

  • 1. 数组(C中的)与链表 2. 操作HashTable的API 3. 在内核中操作PHP语言中数组 4. 小结 在C语言中,我们可以自定义各种各样的数据结构,用来把很多数据保存在一个变量里面,但是每种数据结构都有自己的优缺点,PHP内核规模如此庞大,是否已经找到了一些非常棒的解决方法呢?