【问题标题】:Foreach through a vector containing pointers in c++在c ++中通过包含指针的向量进行遍历
【发布时间】:2015-04-21 02:32:48
【问题描述】:

我制作了一张充满矢量的地图,如下所示:

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 '->'

这意味着“对于超重运算符'->'的无效返回类型'CClass **'

问候

【问题讨论】:

  • 提供的代码编译得很好。错误在其他地方。见ideone.com/Ma2Fda
  • 与您的问题无关,但“Überladenen Operator”的正确翻译是“重载运算符”(至少在 C++ 上下文中)。
  • @JamesKanze 一想到“超重”操作员,我就有点笑了。就像它是用粗体字写的一样:D

标签: c++ for-loop dictionary vector iterator


【解决方案1】:

您可以在 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
    }
}

【讨论】:

    【解决方案2】:

    playerIt 是一个迭代器,而不是指向 CClass 的指针。您需要取消引用迭代器以获取指向CClass 的指针:

    CClass * player = (*playerIt);
    player->ClassMethod(...); // or whatever
    

    【讨论】:

      【解决方案3】:

      playerIt是一个返回CClass*的迭代器,但是你通过operator->解引用了迭代器,所以你需要解引用迭代器返回的指针。

      所以你可能会说playerIt-&gt;cclass_method(),而你应该说(*playerIt)-&gt;cclass_method();

      当然,将 shared_ptr 或 unique_ptr 对象存储在向量中可能会更好、更容易理解,同时使用 typedef 为地图的向量 部分设置别名。

      【讨论】:

        猜你喜欢
        • 2021-11-23
        • 1970-01-01
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-29
        • 1970-01-01
        相关资源
        最近更新 更多