![](/img/trans.png)
[英]For C++ vector initialization, what's the difference between "vector<int>v = n;" and "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部分:
這兩個語句 std::vector V(N) 和 std::vector V[N] 是否等效?
不,您似乎將內置數組聲明語法(即[]
括號)與庫聲明的std::vector<T>
object 的“類數組”語義混淆了。 它可能有助於認識到在幕后, std::vector<T>
將被聲明為struct
或class
。 在非常粗略的意義上,它看起來像這樣:
template<typename T>
struct vector {
vector();
vector(size_type count);
...
T *storage;
size_type count;
};
在這里,您會看到它有幾個不同的構造函數,包括一個采用size_type
並預分配 memory 以存儲足夠的元素的構造函數。 可以在此處找到std::vector
的可用構造函數的完整列表。
您示例中的()
語法是對構造函數的調用,其行為由實現定義。 方括號[]
聲明語法是一種語言功能,它告訴編譯器在堆棧或堆上分配那么多對象,具體取決於分配發生的位置。
在大多數情況下(我不會說永遠不會,因為總會有例外),你不會使用std::vector<int> V[N]
因為std::vector<int> V
已經是一種存儲方式元素的“數組”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.