迭代向量的所有成员

时间:2011-08-04 13:24:36

标签: c++ vector compiler-errors iteration

我有两个struct定义如下:

struct vertex
{
  double x;
  double y;
  double z;
};

struct finalVertex
{
  int n;
  vertex v;
};

我使用以下代码遍历列表并打印所有成员:

  vector<finalVertex> finalVertices;
  vector<finalVertex>::iterator ve;

  for ( ve = finalVertices.begin(); ve < finalVertices.end(); ve++ )
    {
      out << *(ve).v.x << *(ve).v.y << *(ve).v.z << endl;
    }

我收到以下错误代码:

  

main.cpp:651:错误:'class __gnu_cxx :: __ normal_iterator&gt; &GT;”没有   成员名为'v'

访问集合元素的语法正确方法是什么?

6 个答案:

答案 0 :(得分:8)

问题是运营商优先:写(*ve).v.x或更简单,ve->v.x

除此之外,我建议您覆盖operator <<结构的vertex,以使您的代码更具可读性:

std::ostream& operator <<(std::ostream& out, vertex const& value) {
    return out << value.x << " " << value.y << " " << value.z;
}

然后像这样使用它:

for ( ve = finalVertices.begin(); ve != finalVertices.end(); ve++ )
    out << ve->v << endl;

答案 1 :(得分:3)

你应该做的是:

ve->v.x

您还可以做的是:

(*ve).v.x

但很糟糕。 :)

答案 2 :(得分:2)

out << *(ve).v.x << *(ve).v.y << *(ve).v.z << endl;

您的*(ve).v.x相当于*((ve).v.x)。你可能想要:

out << (*ve).v.x << (*ve).v.y << (*ve).v.z << endl;

或者:

out << ve->v.x << ve->v.y << ve->v.z << endl;

另外,你的循环效率不高。不需要每次迭代调用end(),并且迭代器的后增量可能比普通指针/整数重得多,所以你应该习惯在可能的情况下使用预增量:

for ( ve = finalVertices.begin(), end = finalVertices.end(); ve != end; ++ve )

答案 3 :(得分:2)

将你的引用移到parens内部,如下所示:

out << (*ve).v.x << (*ve).v.y << (*ve).v.z << endl;

我还建议将ve < finalVertices.end();更改为ve != finalVertices.end();

答案 4 :(得分:2)

        for ( ve = finalVertices.begin(); ve != finalVertices.end(); ++ve )
        {
            ve->v.x;
        }

答案 5 :(得分:1)

你不应该写 ve&lt; finalVertices.end() 你必须写 ve!= finalVertices.end()