2011-05-07 43 views
3

請參考代碼和註釋如下:在C++矢量分配元素後聲明

vector<int> v1(10); 
cin>>v1[0]; // allowed 
cin>>v1[1]; // allowed 

// now I want v1 to hold 20 elements so the following is possible: 

cin>>v1[15]>>v[19]; // how to resize the v1 so index 10 to 19 is available. 

回答

5

您只需加入新值之前調整向量:

v1.resize(20); 
+0

調整大小後,我可以使用cin輸入而不需要push_back? – 2011-05-07 17:37:16

+0

@Gunner:'vector v1(10);'實際上與'vector v1; v1.resize(20);'。這就是說,你對'push_back'有什麼反應(或者,你對'reserve'和'push_back'有什麼反應?) – 2011-05-07 17:45:57

+0

@James:沒有什麼反對這些,但情況是這樣的,我想輸入直接進入向量而不是臨時變量。最後,兩者都是一樣的,但想知道是否有其他選擇。 – 2011-05-08 06:04:58

2

你可以使用resize像這樣:

v1.resize(20); 
2

vector :: resize()將調整它的大小,並用缺省缺點填充它(int,在這種情況下,所以沒關係)。

vector :: reserve()將分配空間,但不填充它。

您可以使用例如push_back()添加其他項目,直到它具有您想要的許多項目 - 它會根據需要調整自身大小。

+0

它確實很重要。因爲它使用'x()'(在人們抱怨之前(概念上講,確切的細節稍微複雜一些))初始化新成員的方法,而INT是一個POD。 POD值是初始化的值,因此成員設置爲0. – 2011-05-07 17:38:45

+0

請注意,'reserve'不會增加大小,只會增加容量。因此,在OP的情況下,在保留(20)後不能訪問元素15和19。你需要爲此調整大小。 – 2011-05-07 17:39:48

+0

@Martin:理所當然 - 但我的意思是它不是一個涉及到的,耗時的構造函數 - 或者是你可以控制的構造函數。 – jwismar 2011-05-07 17:44:44

3

如果你想從cin儘量多值可用,您可以使用一個istream_iterator迭代器區間,並傳遞到vector範圍構造函數,像這樣:

#include <iterator> // for istream_iterator 
#include <vector> 
#include <iostream> // for cin 

// ... 

std::vector<int> v1((std::istream_iterator<int>(std::cin)), // extra() 
        std::istream_iterator<int>()); 

(額外的括號要求防止"C++ most vexing parse")。參看也Constructing a vector with istream_iterators

+0

儘管這不完全是我想要的,但是它的一個有用的特徵就是它的一致性。在很多情況下,我們要做的第一件事就是在聲明之後將輸入輸入到向量中。 – 2011-05-08 06:03:14