2009-11-19 28 views
1

「的錯誤的只讀位置分配」我有int鍵和vector< vector<int>>數據尷尬的哈希表(具體地,unordered_map)。我需要定期更新這個二維向量中的元素。沒有內在原因,我不應該這樣做,對吧?我已經轉向更新的g ++編譯器,抱怨在下面指定的行上分配了只讀位置。:在unordered_map(C++)

typedef std::tr1::unordered_map< int, vector< vector<int> > > pimap; 

vector< Strain * > liveStrains; 
pimap phenotypeIs; 
int NUM_DEMES = 3; 

... 
vector< Strain * >::const_iterator lsItr; 
for (lsItr = liveStrains.begin(); lsItr != liveStrains.end(); ++lsItr) { 
int thisP = (*lsItr)->getPhenotype(); 
pimap::iterator piItr = phenotypeIs.begin(); 
piItr = phenotypeIs.find(thisP); 
if (piItr != phenotypeIs.end()) { 
    for (int d = 0; d < NUM_DEMES; d++) { 
     (piItr -> second)[ thisStep ].at(d) = (*lsItr)->getI(d); // error here 
    } 
} 
} 

我是C++新手,所以沒什麼太明顯的。感謝您的任何幫助。


繼蒂姆的建議

我已經更換了的代碼的相關部分上面下面:

pimap::iterator piItr = phenotypeIs.find(thisP); 
    if (piItr != phenotypeIs.end()) { 
    for (int d = 0; d < NUM_DEMES; d++) { 
     vector< vector<int> > & thisVec2 = piItr->second; 
     vector<int> & thisVec = thisVec2.at(thisStep); 
     int & ii = thisVec.at(d); 
     ii = (*lsItr)->getI(d); 
     // (piItr -> second)[ thisStep ].at(d) = (*lsItr)->getI(d); // error was here 
    } 

此代碼編譯沒有錯誤,似乎運行正常。像Tim一樣,我仍然不太明白爲什麼修復工作。該錯誤先前出現在gcc版本4.1.2 20080704(Red Hat 4.1.2-44)中,但與gcc版本4.0.1(Apple Inc. build 5465)不兼容。當我不在嚴格的期限內時,我會盡量仔細地分析錯誤!

+0

什麼'(* lsItr) - > getI(d)'返回? – AraK 2009-11-19 00:26:39

+0

(* lsItr) - > getI(d)返回一個int。 (真的。) – Sarah 2009-11-19 00:59:51

+0

@Tim謝謝我誤會了:) – AraK 2009-11-19 01:18:10

回答

1

你確定每個第二級矢量中的每個第一級矢量和NUM_DEMES元素中確實有thisStep + 1個元素嗎?

實際上,如果我正確讀取,實際上並不是分配給地圖迭代器,所以我懷疑該錯誤在向量訪問中。

將最後一條語句分解爲多條語句可能會有所幫助,以便每個語句只做一件事情來縮小問題的範圍。例如,

Strain* strain = *lsItr; 
vector<vector<int> >& vv = piItr->second; 
vector<int>& v = vv[thisStep]; 
int& i = v.at(d);  // <-- My bet is that the error occurs here or the prev. line 
i = strain->getI(d); 

順便說一句,piItr = phenotypeIs.begin();這裏沒有任何影響,它可能是簡單的:

pimap::iterator piItr = phenotypeIs.find(thisP); 
+0

當我用更長的'unpacked'版本替換你所建議的版本時,錯誤消失,事情看起來運行良好。我會在一個小時左右廣泛地測試它。非常感謝您的幫助,這意味着我最初有一個語法問題。 (爲了記錄,有一次,我有一箇舊的編譯器,無法處理沒有指向某處的迭代器聲明,所以我養成了將它們分配給.begin()的習慣。) – Sarah 2009-11-19 01:26:25

+0

奇怪的是,它應該是就實際調用的方法和操作員而言,100%是相同的。你可能發現了g ++或STL中的錯誤。您可以一次一步地將其重新合併,以嘗試找到問題,但爲了清楚起見,將其展開可能會更好。 – 2009-11-19 02:01:44

-1
(piItr -> second)[ thisStep ].at(d) 

在()返回一個迭代器內載體,不能訪問的價值。你想要的是

*((piItr -> second)[ thisStep ].at(d)) 
+2

不,'vector :: at()'返回一個引用或const引用給vector的元素類型。 http://www.cplusplus.com/reference/stl/vector/at/ – 2009-11-19 01:15:42

+0

對,我的錯。 – 2009-11-19 02:18:43