2011-11-28 54 views
-1

其中RoomCentreNodeVectors是一個整數向量的向量。 roomKills是ints和level的向量.Nodes()返回Node對象的向量。 Node對象的Room()函數返回int。這個循環的正確類型是什麼?

for (std::vector<std::vector<int>>::size_type i = 0; i < level.RoomCentreNodeVectors().size(); i++) 
{ 
    RoomKills.push_back(level.Nodes()[level.RoomCentreNodeVectors()[i][0]].Room()); 
} 

for (std::vector<int>::size_type i = 0; i < level.RoomCentreNodeVectors().size(); i++) 
{ 
    RoomKills.push_back(level.Nodes()[level.RoomCentreNodeVectors()[i][0]].Room()); 
} 
+0

是不是有一個原因,你不只是堅持迭代器? –

+0

類型的循環? – Vlad

+0

顯然,你需要將所有這些東西重構爲命名變量。我的眼睛流血了。 –

回答

2

簡短的回答是,你應該使用的SIZE_TYPE正被索引到的矢量類型。如果RoomCentreNodeVectors()返回int向量的向量,那麼您的第一個循環會正確指定類型。很可能它會等於size_t。

其餘部分回答的不只是你的問題,你可能會忽略它,如果你願意。

首先,typedefs將有助於更容易閱讀。例如

typedef std::vector<Node> NodeVec; 
typedef std::vector<int> IntVec; 
typedef std::vector<IntVec> IntVecVec; 
for (IntVecVec::size_type i = 0; ... 

除非RoomCentreNodeVectors的值()這個循環過程中的變化,我肯定會保存返回值,這樣你就不必作出這樣的函數調用每次。如果函數返回的是一個值而不是引用類型,那麼尤其如此,因爲每次在循環中都會複製該向量兩次。正如R. Martinho Fernandes提到的那樣,你也可以使用迭代器,並避免整個size_type問題:

const IntVecVec& nodeVecs = RoomCentreNodeVectors(); 
IntVecVec::const_iterator end = nodeVecs .end(); 
const NodeVec& nodes = level.Nodes(); // if Nodes() doesn't change during loop 
for (IntVecVec::const_iterator iter = nodeVecs .begin(); iter != end; ++iter) 
{ 
    const IntVec& vec = *iter; 
    int j = vec[0]; 
    int room = nodes[j].Room(); 
    RoomKills.push_back(room); 
} 
1

兩者都是正確的,因爲size_type實際類型不依賴於模板專業化。它通常是一樣size_t,我建議你使用可讀性更好:

for (size_t i = 0; i < level.RoomCentreNodeVectors().size(); i++) 
{ 
    RoomKills.push_back(level.Nodes()[level.RoomCentreNodeVectors()[i][0]].Room()); 
} 

如果我看到你的片段放在代碼,我會重構它。

+0

嗯,但爲什麼它要求你指定一個矢量類型? size_type和size_t之間是否有區別? – SirYakalot

+0

@SirYakalot我不認爲它保證是一樣的,但最可能的是。您需要指定,因爲您無法使用其他矢量(或任何模板)。 –

+0

請參閱[size_t vs container :: size_type](http://stackoverflow.com/questions/918567/size-t-vs-containersize-type)。我發現[這個答案](http://stackoverflow.com/a/920202)特別有趣。 – Brian

1

我將這個代碼更改爲使用迭代器......然後,您可以使用C++ 11 auto關鍵字執行以下操作:

for(auto iter = begin(level.RoomCentreNodeVectors); iter != end(level.RoomCentreNodeVectors); iter++) 
{ 
    RoomKills.push_back(level.Nodes()[(*iter)[0]].Room()); 
} 
+0

這並沒有解決這個問題。 –

+0

爲什麼不呢?他想知道循環的類型是什麼,並且我們使用'auto'關鍵字和迭代器來允許編譯器推斷該類型,而不是明確指定它。 – Jason

+0

好的...那麼循環的類型是什麼(我理解迭代器的類型)? –