【问题标题】:Difference b/w std::vector<int> V(N) and std::vector<int> V[N]?黑白 std::vector<int> V(N) 和 std::vector<int> V[N] 的区别?
【发布时间】:2021-08-26 14:34:31
【问题描述】:

这两个语句std::vector&lt;int&gt; V(N)std::vector&lt;int&gt; V[N] 是否等效??

它们又是什么意思?

【问题讨论】:

  • 第一个是预先分配了 N 个元素的向量。后者是一个由 N 个空向量组成的数组。
  • 我问你:int foo(42)int foo[42]有什么区别?
  • @Eljay 这是否意味着第二个语句是一种二维数组??
  • 这意味着第二个语句可能应该是std::array&lt;std::vector&lt;int&gt;,N&gt;,但这不是表示二维数组的最佳方式。 std::vector&lt;int&gt; V[N]充斥着低质量的教程和奇怪的竞赛代码,它可能有一些实际用途,但我在其他地方从未见过它
  • 是的,第二条语句是一种二维数组。一个奇怪的。很像狮子-山羊-蛇嵌合体是一种奇异的蛇纹石(或奇异的狮子座,或奇异的山羊座)。

标签: c++ vector stl


【解决方案1】:

std::vector&lt;int&gt; V(N) 创建一个大小为Nstd::vector&lt;int&gt;

std::vector&lt;int&gt; V[N] 创建一个大小为N 包含 std::vector&lt;int&gt;数组

您可以从这段代码中看到这一点:

#include <vector>
#include <iostream>
#include <typeinfo>
const int N = 100;

int main()
{
    std::vector<int> test(N);
    std::cout << test.size() << '\n';
    std::cout << typeid(test[0]).name() << '\n'; //output i

    int i=1; test[0] = i;  //runs fine
    //std::vector<int> i2; test[0] = i2; //converting error

    std::vector<int> test2[N];
    std::cout << sizeof(test2)/sizeof(test2[0]) << '\n';
    std::cout << typeid(test2[0]).name();

    //int i3=1; test2[0] = i3; //converting error
    std::vector<int> i4; test2[0] = i4; //runs fine
}

结果:

100
i
100
St6vectorIiSaIiEE

编辑:正如@463035818_is_not_a_number 和@Eljay 提到的,为了清楚起见,std::vector&lt;int&gt; V[N] 应该写成std::array&lt;std::vector&lt;int&gt;,N&gt;

【讨论】:

    【解决方案2】:

    这个问题的答案分为两部分。第一个涉及基本语法,第二个涉及std::vector 容器的语义。其中一个是语言本身内置的,另一个被声明为标准库的一部分。

    第 1 部分:

    这两个语句 std::vector V(N) 和 std::vector V[N] 是否等价?

    没有。您似乎将内置数组声明语法(即[] 括号)与库声明的std::vector&lt;T&gt; 对象的“类数组”语义混淆了。这可能有助于认识到在幕后std::vector&lt;T&gt; 将被声明为structclass。在非常粗略的意义上,它看起来像这样:

    template<typename T>
    struct vector {
        vector();
        vector(size_type count);
        ...
        T *storage;
        size_type count;
    };
    

    在这里您会看到它有几个不同的构造函数,包括一个接受size_type 并预先分配内存以存储足够元素的构造函数。 std::vector 的可用构造函数的完整列表可以在 here 找到。

    您示例中的() 语法是对构造函数 的调用,其行为由实现定义。方括号[] 声明语法是一种语言功能,它告诉编译器根据分配发生的位置在堆栈或堆上分配那么多对象。

    在大多数情况下(我不会说永远不会,因为总会有例外),您不会使用std::vector&lt;int&gt; V[N],因为std::vector&lt;int&gt; V 已经是一种存储元素“数组”的方式。

    【讨论】:

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