区别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)
创建大小为 N
的 std::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>
将被声明为 struct
或 class
可能会有所帮助。在非常粗略的意义上,它看起来像这样:
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
已经是一种存储“数组”的方法元素数。
这两个语句 std::vector<int> V(N)
和 std::vector<int> V[N]
等价吗??
还有它们是什么意思?
std::vector<int> V(N)
创建大小为 N
的 std::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>
将被声明为 struct
或 class
可能会有所帮助。在非常粗略的意义上,它看起来像这样:
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
已经是一种存储“数组”的方法元素数。