2014-05-02 35 views
3

我這有一小段代碼VISUAL C++ 2010載體的定位似乎沒有更新

int row[7]; 
bool equals = false; 

std::vector<int>range; 

for(int i = 1; i <= 35; ++i) 
{ 
    range.push_back(i); 
} 

for(int i = 0; i < 7; i++){ 
    int number = range[rand() % range.size() + 1]; 
    std::vector<int>::iterator pos = find(range.begin(), range.end(), number); 
    row[i] = number; 

    range.erase(range.begin() + (*pos - 1)); 
    std::cout << row[i] << endl; 
} 
return 0; 

它需要遠離向量隨機元素,我有問題,我每次從尺寸更新的矢量中移除一個對象,但位置似乎沒有改變矢量中的單個數字,這使得程序崩潰,因爲我有時會在矢量的邊界外移動。

我試過用vector :: shrink_to_fit,但它似乎沒有重新評估向量項目的位置。

我錯過了什麼?這似乎是一件很簡單的事情,但我無法用頭圍住它。

P.S 我是一個C++擦洗所以如果你有任何關於代碼的輸入是壞/不安全的我打開的建議/建設性的批評。

+1

偉大的,你投了下去,用了給我任何輸入你認爲這個問題是錯誤的。 –

+0

您應該發佈一些重現問題的最小代碼。用你發佈的內容,只能猜測。 – juanchopanza

+0

現在編輯它包含所有產生問題的代碼@juanchopanza –

回答

3
rand() % range.size() + 1 

可以去矢量 使用

rand() % range.size() 

使用這段代碼,而不是邊界之外:

std::vector<int>range; 

for(int i = 1; i <= 35; ++i) 
{ 
    range.push_back(i); 
} 
srand(time(0)) ; 
for(int i = 0; i < 7; i++){ 
    int index = rand() % range.size() ; 
    int number = range[index]; 
    row[i] = number; 
    range.erase(range.begin() + index); 
    std::cout << row[i] << endl; 
} 
+1

這可能是真的,但問題似乎是迭代器第一次運行時得到緩存,我不知道如何強制它重新評估。 –

+0

我更新了答案 並獲取索引的值,然後再次搜索該值以將其刪除,而不是刪除實際索引處的元素不是最聰明的做法,正如您可能猜到的那樣,找到可能使迭代器指向具有相同值的不同索引,這可能是也可能不是問題。 – ColonelMo