簡體   English   中英

初始化和設置向量<int>

[英]Initializing and setting a vector<int>

vector<int> v;
v.push_back(0); //you have to do this
//v[0] = 0;     //this gives you an error
v[0] = 1000000; //but now you can set it

那么,第一次初始化向量時又為什么要push_back,然后才可以對其進行設置呢? 對於基本類型,例如int,可以進行int i = 0的操作; 用於初始化。

如果您事先知道向量的大小,請絕對不要使用簡單的push_back()序列,因為如果向量很大(例如,> 512個元素),可能會浪費時間進行重新分配。

最好做:

選項1:預分配和推送

vector<int> v;
v.reserve(N); // N is the expected size, but right now [0] is undefined. 
for (...) { 
  v.push_back(...);  // No problems in adding more than N elements, but may have to reallocate.        
}

選項2:調整大小和填充

vector<int> v;
v.resize(N);
for (size_t i=0;i<N;i++)
  v[i] = ...; // You can't write past N-1 here!

選項3:直接以正確的尺寸創建,然后填充

vector<int> v(N);
for (size_t i=0;i<N;i++)
  v[i] = ...; // You can't write past N-1 here!

選項4:創建一個大小正確的向量,並將其初始化為某個固定值

vector<int> v(N,val); // v[0:N-1] are all equal to val

因為當您第一次創建向量時,該向量為空,所以vector[0]不存在。 push_back向矢量添加元素,然后您可以使用vector[i]對其進行修改或讀取

因為std::vector<int>不是std::map<int, int>

std::vector要求您手動push_back()或(在C ++ 11中) emplace_back()元素才能包含在集合中。 當然,它的某些構造函數允許您在其中包含初始元素。 當然還有它的賦值運算符。

下標( [] )運算符僅應用於讀取和/或修改現有元素。 使用operator[]越界(不存在)元素進行索引將導致不確定的行為

為了使所有內容100%清晰,您聲明了向量,

vector<int> v;

在某種意義上類似於變量的聲明:

int x;

然后如果您想說,

cout << x;

你會得到垃圾。 不過,如果您聲明

int x(2);

一切都會好起來的。 對於矢量也是如此:

vector<int> v;

為向量分配一些內存空間,但不填充。 然后您可以指定

vector<int> v(2);

這意味着您現在已經聲明了兩個元素的向量,或者使用了僅向量功能-push_back。 正如您所注意到的,這將在向量中添加元素。

您無法訪問v[0]因為還沒有v[0] 向量從默認構造為空向量開始。 將元素推到背面,其大小將增加1。然后,您就可以訪問剛剛添加的元素。 如果要從一個元素開始,請使用適當的構造函數:

std::vector<int> v(1); //one zeroed integer

您正在比較蘋果和桔子。 int i = 0; 就像std::vector<int> v;

您應該首先分配內存以設置元素值,例如

v.resize(new_size);

或使用push_back方法添加元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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