2015-07-12 91 views
0

C++標準庫中向量的大小()返回零 size()應該返回當前元素數。C++向量大小返回零

我的代碼有問題嗎?或者它是一個函數中的錯誤? 它發生在我的PC上的MinGW編譯器上,也發生在Linux上的g ++編譯器上。容量()返回預期的結果。

using namespace std; 

    bool binarySearch(vector<int>& nums, int k) 
    { 
    int low, high, mid; 

     low = 0; 
     high = nums.size(); 
     mid = (low+high)/2; 
     printf("low %d high %d mid %d \n", low, high, mid); 

     return true; 
    } 

    int main() 
    { 
     int result; 
     vector<int> v1; 
     v1.reserve(30); 
     v1[0] = 1; 
     for (int index = 1; index < 30; index++) 
     { 
      v1[index] = v1[index-1] + (rand()%10); 
     } 

     bool flag = binarySearch(v1, 57); 

     return 0; 
    } 
+0

我很困惑,因爲OP的代碼有設置每個索引元素的循環,但是這個頁面是這樣的:http://en.cppreference.com/w/cpp/container/vector/operator_at它說* *運算符[]不會插入新元素**。所以,即使你保留並設置了元素,元素也沒有被插入(沒有任何例外,這不是很有用的信息,你可以像'v1.at(0)= 1'那樣使用'std :: vector :: at'會拋出異常) – texasbruce

回答

3

添加使用v1.push_back(...)新的元素。目前,您只需預留vector中的內存 - 這不會改變大小,只會改變其容量。

之後使用索引操作符處理vector是不好的樣式,您應該只檢索/編輯已定義爲「在容器中」的元素。與其他語言相比,索引操作符不會自動將元素添加到容器中。在你的情況下,你只是操縱一些保留的內存。注意:「檢查」訪問方法at()會在您的情況下引發異常。

+0

感謝您的回覆。你的解釋回答了我的問題。 – NB2345

1

reserve只是預先分配內存,它不會改變size。你可以省略reverse,只是使用

vector<int> v1(30); 

或者,也許更好,你可以利用push_back

vector<int> v1; 
v1.push_back(1); 
for (int index = 1; index < 30; index++) 
{ 
    v1.push_back(v1[v1.size()-1] + (rand()%10)); 
} 
2
v1.reserve(30); 

不會更改vector元素的數量,它只是確保了vector有足夠的空間來保存而不重新分配30元。使用

v1.resize(30); 

改變到元件的數目在載體或使用

std::vector<int> v1(30); 

初始化v1含有30個int小號初始化爲0。

也有看看documentation閱讀std::vector成員函數完成的功能。