我有两个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'
访问集合元素的语法正确方法是什么?
答案 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()