这个循环的正确类型是什么?

时间:2011-11-28 20:02:46

标签: c++

其中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());
}

3 个答案:

答案 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());
}