【问题标题】:what is the difference between defining a vector as vector<int> v(n) vs vector<int> v[n]? [duplicate]将向量定义为 vector<int> v(n) 与 vector<int> v[n] 有什么区别? [复制]
【发布时间】:2022-01-13 21:47:06
【问题描述】:

当我使用这段代码时:

int main()
{
    unsigned int n;
    cin >> n;
    vector<int>number[n];
  
    return 0;
}

编译器将“n”标记为错误:
“表达式必须有一个常数值”
"变量'n'的值不能用作常量"

但是当我改用vector&lt;int&gt; v1(n) 时,错误消失并且运行良好。

所以,这是我的问题:
将向量定义为 vector&lt;int&gt; v1(n)vector&lt;int&gt; v2[n] 有什么区别?
向量是否使用动态分配?

提前致谢

【问题讨论】:

  • 区别在于一个是向量,一个是向量的数组
  • 另外,因为n是在运行时动态读入的,所以代码是无效的C++。对于 C 风格的数组,它需要是一个常量(constconstexpr)。
  • 术语说明:任何可以改变大小或形状的东西都是动态的。也就是说,C++ 中的任何内容都不会真正改变大小。 vector 的大小始终相同。它指向的数组永远不会改变大小。当vector需要一个不同大小的数组时,它会创建一个新数组,将旧数组复制到其中,释放旧数组并指向新数组。大小没有变化,只是被替换了。

标签: c++ vector


【解决方案1】:
type_name variable_name[array_size];

是默认初始化数组变量的语法。 vector&lt;int&gt;number[n]; 是一个包含 n 个向量的数组。如果大小不是编译时间常数 - 例如示例中没有,则程序格式错误,正如您引用的错误所证明的那样。

type_name variable_name(args);

是直接初始化变量的语法。

向量是否使用动态分配?

与大多数标准容器(除std::array 之外的所有容器)一样,矢量元素是动态对象。它使用已提供给它的分配器获取存储空间。

【讨论】:

    【解决方案2】:

    两种定义的区别

    • vector&lt;int&gt; v1(n) 定义一个包含n 元素的向量。

    • vector&lt;int&gt; v2[n] 定义了一个可变大小的向量数组,每个向量都不包含任何元素。 这通常称为VLA(可变长度数组)和not officially part of C++(但它 C99 的一部分)。像 gcc 这样的一些编译器也支持 c++,但你不应该指望它。

    std::vector分配

    std::vectors 将使用提供的分配器(第二个模板参数std::vector&lt;T,Allocator&gt;)分配它们的元素。

    默认情况下,这将是 std::allocator&lt;T&gt;,它将使用 newdelete - 即,它将被分配到空闲存储区(主要实现为堆)。

    如果您想使用其他分配策略(heres 您需要为自定义分配器实现什么),您可以提供不同的分配器

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 2021-08-26
      • 1970-01-01
      • 2021-11-07
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2022-08-07
      相关资源
      最近更新 更多