2012-05-02 34 views
-1

如此奇怪的情況,我創建了一個結構列表,然後我試圖用新值更新其中一個列表成員,然後將它移回到列表中。遞增int時向量下標超出範圍嗎?

我似乎能夠在迭代器中複製結構體的值,但是當我嘗試更新結構體成員的值(使用int ++;)時,它會在vector類中引發異常。

任何有關可能發生的情況的解釋都會有所幫助。

struct Blob 
{ 
    int x; 
    int y; 
}; 

list<Blob> blob; 
// Add a Blob to blob using .push_back(); here 
for(list<Blob>::iterator iterator=blob.begin(); iterator!=blob.end(); ++iterator) 
{ 
    Blob temp; 
    temp.x = ((Blob)*iterator).x; 
    temp.y = ((Blob)*iterator).y; 
    if (temp.x < 10 - 1) 
     temp.x++; /* Exception: vector: line 932 - "Vector subscript out of range" */ 
    ((Rain)*iterator) = temp; 
} 
+6

顯示,編譯並表現出相同的行爲將大大低於代碼片段無效更有用一個完整的測試用例並且不包含這可能涉及的任何矢量。 – PlasmaHH

+2

行('(Rain)* iterator)= temp;'應該做什麼?什麼是'雨',你爲什麼要投射? – interjay

+3

爲什麼你不說'temp.x = iterator-> x'? (雖然這不是你需要的,但這不是你的問題) – Benj

回答

0

當您想要更新對象的現有值然後參考它。我已經寫了代碼示例解釋相同

#include<list> 
#include<iostream> 
using namespace std; 
struct Test 
{ 
    int x; 
    int y; 
}; 

int main() 
{ 
    list<Test> lTest; 
    int i = 0; 
    for(i=0;i<5;i++) 
    { 
     Test t1; 
     t1.x = i; 
     t1.y = i*i; 
     lTest.push_back(t1); 
    } 

    list<Test>::iterator lIter = lTest.begin(); 
    for(;lIter != lTest.end();++lIter) 
    { 
     Test &t1 = *lIter; 
     cout<<"1 Val is:"<<t1.x<<"|"<<t1.y<<endl; 
     t1.x += 2; 
     t1.y += 2; 
     cout<<"2 Val is:"<<t1.x<<"|"<<t1.y<<endl; 
    } 

    lIter = lTest.begin(); 
    for(;lIter != lTest.end();++lIter) 
    { 
     Test t1 = *lIter; 
     cout<<"3 Val is:"<<t1.x<<"|"<<t1.y<<endl; 
    } 

    return 0; 
} 
+3

爲什麼要參考? 'lIter-> x + = 2'有什麼問題? – Benj

+0

這是一個好主意.....使用iter要好得多。 – Raghuram

0

如果你正在寫一個循環很可能有另一種方式來做到這一點。您可以使用std::for_each

#include <list> 
#include <algorithm> 

struct Blob 
{ 
    int x; 
    int y; 
}; 

void incrementXIfLessThanNine(Blob& blob) 
{ 
    if(blob.x < 9) 
    { 
     blob.x++; 
    } 
} 

int main() 
{ 
    std::list<Blob> blobs; 
    std::for_each(blob.begin(), blob.end(), incrementXIfLessThanNine); 
    return 0; 
} 

如果您使用C++ 11:

#include <list> 

struct Blob 
{ 
    int x; 
    int y; 
}; 

int main() 
{ 
    std::list<Blob> blobs; 
    for(Blob& blob: blobs) 
    { 
     if(blob.x < 9) 
     { 
      blob.x++; 
     } 
    } 
    return 0; 
}