【问题标题】:Why is vector<Data*>::iterator valid and vector<Data*>*::iterator not?为什么 vector<Data*>::iterator 有效而 vector<Data*>*::iterator 无效?
【发布时间】:2010-07-26 20:34:34
【问题描述】:

我有这三个相关的班级成员:

vector<Frame*>* poolFrames;
vector<Frame*>*::iterator frameIterator;
vector<vector<Frame*>::iterator>* poolFrameIterators;

当我编译时,gcc 会告诉我

错误:'::' 的使用无效 错误:在“frameIterator”之前需要“;”

参考中间线,我在这里定义了 frameIterators。当我松开指向向量的指针并使其成为向量::迭代器时,它就消失了。但是,我希望它们成为指针。有没有一种特殊的方法来定义我想要的数据类型,还是我需要使用 vector::iterator 然后取消引用?

【问题讨论】:

  • 它无效,因为它没有任何意义(根据 C++ ISO 标准)。我什至无法弄清楚你想要什么......请记住,存储矢量迭代器并不是最好的主意,因为矢量迭代器很容易变得无效。
  • 我知道我在做什么,知道它可能不稳定,并且有预防措施来避免它出现问题。我想遍历 Frame* 的向量,但是向量需要是一个指针。
  • 有你的困惑:你似乎没有区分指针和指针。只需松开第二行中的第二个星号就可以了。

标签: c++ vector


【解决方案1】:

我明白你想做什么。您已将 poolFrames 定义为指向向量的指针。然后你想将frameIterator 定义为poolFrames 的迭代器。由于poolFrames 是一个指针,你认为你需要一个特殊的指向向量的指针迭代器,但你错了。

向量迭代器是向量迭代器是向量迭代器,无论您如何设法首先引用向量。你需要frameIterator 成为一个简单的迭代器:

vector<Data*>::iterator frameIterator;

要为该变量赋值,您需要取消对向量指针的引用,如下所示:

frameIterator = poolFrames->begin();

如果poolFrames 是向量而不是指向向量的指针,则应使用点运算符:poolFrames.begin()

【讨论】:

  • 谢谢你,你真的明白我想要做什么。这一切都为我解答。
【解决方案2】:

如果你想要一个指向迭代器的指针,那么就这样做吧:

vector<Frame*>::iterator*

星号始终跟在所指向的类型之后。你拥有它的方式很像写vector*&lt;Frame*&gt;::iterator,只是星号放错了位置。

【讨论】:

  • 我认为这不是真的。我的第一个声明,'vector*' 编译得很好,而 'vector*' 没有。
  • 确实如此。在您的第一个声明中,指向的类型是vector&lt;Frame*&gt;,后面加一个星号给出vector&lt;Frame*&gt;*。在第二个声明中,我认为您希望指向的类型为vector&lt;Frame*&gt;::iterator,在这种情况下,后跟一个星号会给出vector&lt;Frame*&gt;::iterator*。如果这还不够,我认为你应该澄清这个问题。
【解决方案3】:

你真正想要什么数据类型?

vector&lt;Frame*&gt;* poolFrames; 是一个指向帧指针向量的指针。你真的只想要一个帧指针向量吗?

在这种情况下,错误是有道理的。 vector&lt;Frame*&gt; 有迭代器。指向此类事物的指针没有迭代器。

【讨论】:

  • 所以每次我想从迭代器中获取指针时都需要取消引用,对吗?
【解决方案4】:

vector* 的类型是一个指针,它没有迭代器。

【讨论】:

    【解决方案5】:
    vector<Frame*>* 
    

    是一个类型表达式但它没有成员iterator 这有点像在指针上使用.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 2015-12-15
      • 2023-03-06
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2013-02-18
      相关资源
      最近更新 更多