【问题标题】:How do you use a C++ iterator?你如何使用 C++ 迭代器?
【发布时间】:2009-12-08 23:39:06
【问题描述】:

我有一个像这样的向量:

vector<MyType*> _types;

我想遍历向量并在向量中的每个 MyTypes 上调用一个函数,但是我从编译器得到无效的返回错误。看来pos 迭代器不是指向MyType 的指针,它是别的东西。我不明白什么?

编辑:一些代码..

    for (pos = _types.begin(); pos < _types.end(); pos++)
{
    InternalType* inst = *pos->GetInternalType();
}

编译器错误是:

  • 重载的“运算符 ->”返回类型无效的“InternalType**”
  • “GetInternalType”:不是“std::_Vector_iterator<_ty>”的成员

编辑 pt2

我的向量应该包含指针还是对象?优缺点都有什么?如果我使用new 创建实例,我猜我只能使用指向 MyType 的指针向量,对吗?

【问题讨论】:

  • 当您甚至没有向我们展示您尝试过的内容时,很难告诉您您不理解什么;)
  • (*pos)->GetInternalType()
  • “我的向量应该包含指针还是对象?”。如果它包含对象,那么您添加到向量中的对象将被复制到向量中。矢量中对象的更改不会影响原件。所以这取决于你是否想要。

标签: c++ stl iterator


【解决方案1】:

如果向量包含对象而不是指针,您可以使用pos-&gt;foo()。迭代器“就像”一个指针。但是您的向量包含指针,因此迭代器将像指向指针的指针一样,因此需要取消引用两次。

MyType *pMyType = *pos; // first dereference
if (pMyType) {          // make sure the pointer is not null
  pMyType->foo();       // second dereference
}

如果你确定指针不为空,你可以这样做:

(*pos)->foo();

*pos 周围的括号是必需的,因此取消引用适用于 pos,而不是 pos-&gt;foo()。操作顺序。

如果您的向量需要包含类层次结构中的项目(例如,MyType 的子类),那么您必须将其设为指针向量。否则,对象向量可能更简单。

【讨论】:

  • 感谢 dan,我在这里需要的一切,尤其是关于类层次结构的提示 :)
【解决方案2】:

您已将_types 定义为指针向量。假设您的 pos 是该向量的迭代器,它将是指向指针的迭代器,因此您需要将其解引用 两次 以获取 MyType 的实例。

编辑:根据您添加到问题中的内容:您有类似*pos-&gt;whatever 的内容。请改用(*pos)-&gt;whatever。就目前而言,您正在尝试使用 whatever 作为迭代器的成员,然后取消引用结果...

【讨论】:

    【解决方案3】:

    迭代器不是指针。迭代器是行为类似于指针的类型。在某些容器的某些实现中,迭代器类型实际上可能是一个指针(所有指针都是迭代器),但这不能作为一般规则。

    如果需要从迭代器生成指针,可以使用&amp;*pos,它会解引用迭代器,然后获取结果的地址(当然,如果一元operator &amp;被重载了,这个就不行了,但那完全是另一回事)。

    【讨论】:

      【解决方案4】:
      for (vector<MyType*>::iterator i = _tpes.begin(); i != _types.end(); ++i) {
        // do something with i
      }
      

      【讨论】:

        【解决方案5】:
        for (vector<MyType*>::iterator it = _types.begin();
             it != _types.end();
             ++it)
        {
            // `*it` is this iteration's `MyType*` from your vector
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-06
          • 1970-01-01
          • 1970-01-01
          • 2020-02-18
          • 2010-09-24
          • 2014-03-26
          • 1970-01-01
          相关资源
          最近更新 更多