其中RoomCentreNodeVectors是整数向量的向量。 roomKills是int和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 :(得分: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 :(得分: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());
}
如果我在代码中看到你的代码片段,我会重构它。
答案 2 :(得分:1)
我会将此代码更改为使用迭代器...然后,您可以使用C ++ 11 auto
关键字执行以下操作:
for(auto iter = begin(level.RoomCentreNodeVectors); iter != end(level.RoomCentreNodeVectors); iter++)
{
RoomKills.push_back(level.Nodes()[(*iter)[0]].Room());
}