区别b/wstd::vector<int>V(N)和std::vector<int>V[N]?

Difference b/w std::vector<int> V(N) and std::vector<int> V[N]?

这两个语句 std::vector<int> V(N)std::vector<int> V[N] 等价吗??

还有它们是什么意思?

std::vector<int> V(N) 创建大小为 Nstd::vector<int>

std::vector<int> V[N] 创建一个 数组 大小 N 包含 std::vector<int>.

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

#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<int> V[N] 应该写成 std::array<std::vector<int>,N>

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

第 1 部分:

Are these 2 statements std::vector V(N) and std::vector V[N] equivalent??

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

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

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

中找到

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

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