![](/img/trans.png)
[英]Initializing a member vector<vector<int>> in the constructor value-by-value
[英]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個元素),可能會浪費時間進行重新分配。
最好做:
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.
}
vector<int> v;
v.resize(N);
for (size_t i=0;i<N;i++)
v[i] = ...; // You can't write past N-1 here!
vector<int> v(N);
for (size_t i=0;i<N;i++)
v[i] = ...; // You can't write past N-1 here!
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.