这个循环的正确类型是什么
what is the correct type for this loop?
其中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());
}
相关文章:
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 类名后跟括号的类型是什么
- std::chrono::duration::count函数的实际结果类型是什么
- c++运算符重载-我实际返回的操作数类型是什么
- 运算符和返回类型是什么意思?
- 指向 2D 数组的指针的类型是什么?
- RSA_verify中预期的数据类型是什么,无法验证从 Java 生成的签名
- 共享_ptr中多功能数组的类型是什么
- 构造函数的类型是什么?
- 字符串中单个字符作为数组的数据类型是什么
- 该结构继承的类型是什么
- 如果我获得Integer和Double的产品,输出的数据类型是什么
- C 中被视为可可的类型是什么
- 当函数采用右值引用时,函数中该变量的类型是什么?
- STD :: SETW,STD :: SETFILL等的真实返回类型是什么?
- 模板类中引用的引用的类型是什么
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 包含通过引用捕获的 lambda 函数的"variable"的类型是什么?
- 通过插座发送的内容的数据类型是什么