簡體   English   中英

黑白差異 std::vector<int> V(N) 和 std::vector<int> V[N]?</int></int>

[英]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部分:

這兩個語句 std::vector V(N) 和 std::vector V[N] 是否等效?

不,您似乎將內置數組聲明語法(即[]括號)與庫聲明的std::vector<T> object 的“類數組”語義混淆了。 它可能有助於認識到在幕后, std::vector<T>將被聲明為structclass 在非常粗略的意義上,它看起來像這樣:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM