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

what is the correct type for this loop?

本文关键字:类型 是什么 循环      更新时间:2023-10-16

其中RoomCentreNodeVectors是int向量的向量。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());
}

简单的答案是,您应该使用索引到的向量类型的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);
}

两者都是正确的,因为size_type的实际类型不依赖于模板专用化。它通常与size_t相同,我建议您使用它来提高可读性:

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

如果我在代码中看到你的代码片段,我会重构它。

我会将此代码更改为使用迭代器。。。然后,您可以使用C++11auto关键字执行以下操作:

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