Foreach 通过包含 C++ 中的指针的向量
Foreach through a vector containing pointers in c++
我制作了一张充满矢量的地图,如下所示:
std::map<int, std::vector<CClass*>> pointers = getMap();
现在我想遍历地图的每个槽位以及存储在地图中的矢量的每个槽位。
地图是这样的:
for (std::map<int, std::vector<CClass*>>::iterator it = pointers.begin(); it != pointers.end(); it++)
这很好用,它像我想要的那样遍历每个对象。
但现在我想遍历向量中的每个槽,我这样试过:
for (std::vector<CClass*>::iterator playerIt = it->second.begin(); playerIt != it->second.end(); playerIt++)
如果我想访问存储在其中的值,编译器会给我这个错误:
file.cpp(552) : error C2839: Ungültiger Rückgabetyp 'CClass **' für überladenen Operator '->'
这意味着“对于超重运算符'->'
无效的return类型'CClass **'
问候
您可以在 C++11 中使用基于范围的 for 循环来更易读地处理此问题
for (auto& element : pointers)
{
for (auto& player : element.second)
{
// player will be a CClass* that you can use
std::string name = player->GetName(); // For example
}
}
playerIt
是一个迭代器,而不是指向 CClass
的指针。您需要取消引用迭代器以获得指向 CClass
的指针:
CClass * player = (*playerIt);
player->ClassMethod(...); // or whatever
playerIt
是returns一个CClass*
的迭代器,但是你通过operator->解引用迭代器,所以你需要解引用迭代器返回的指针。
所以你可能在应该说 (*playerIt)->cclass_method();
的时候说 playerIt->cclass_method()
当然,在向量中存储 shared_ptr<> 或 unique_ptr 对象可能更好,也更容易理解,同时使用 typedef 为地图的 vector<> 部分添加别名。
我制作了一张充满矢量的地图,如下所示:
std::map<int, std::vector<CClass*>> pointers = getMap();
现在我想遍历地图的每个槽位以及存储在地图中的矢量的每个槽位。
地图是这样的:
for (std::map<int, std::vector<CClass*>>::iterator it = pointers.begin(); it != pointers.end(); it++)
这很好用,它像我想要的那样遍历每个对象。
但现在我想遍历向量中的每个槽,我这样试过:
for (std::vector<CClass*>::iterator playerIt = it->second.begin(); playerIt != it->second.end(); playerIt++)
如果我想访问存储在其中的值,编译器会给我这个错误:
file.cpp(552) : error C2839: Ungültiger Rückgabetyp 'CClass **' für überladenen Operator '->'
这意味着“对于超重运算符'->'
无效的return类型'CClass **'问候
您可以在 C++11 中使用基于范围的 for 循环来更易读地处理此问题
for (auto& element : pointers)
{
for (auto& player : element.second)
{
// player will be a CClass* that you can use
std::string name = player->GetName(); // For example
}
}
playerIt
是一个迭代器,而不是指向 CClass
的指针。您需要取消引用迭代器以获得指向 CClass
的指针:
CClass * player = (*playerIt);
player->ClassMethod(...); // or whatever
playerIt
是returns一个CClass*
的迭代器,但是你通过operator->解引用迭代器,所以你需要解引用迭代器返回的指针。
所以你可能在应该说 (*playerIt)->cclass_method();
playerIt->cclass_method()
当然,在向量中存储 shared_ptr<> 或 unique_ptr 对象可能更好,也更容易理解,同时使用 typedef 为地图的 vector<> 部分添加别名。