如何使用STL迭代器处理结构

时间:2013-10-02 06:52:09

标签: c++

我是C ++的新手。我正在使用g ++编译器。我试图用C ++学习STL库的操作。工作时我在这段代码中发现了一些问题。请解释错误原因以及如何处理错误。

#include<iostream>
#include<list>
using namespace std;

typedef struct corrd{
int x;
int y;
}XY;

int main()
{
list<XY> values;
list<XY>::iterator current;
XY data[10];
for(int i=0;i<10;i++)
{
    data[i].x = i+10;
    data[i].y = i+20;   
}
for(int i=0;i<10;i++)
{
    values.push_front(data[i]);
}
current = values.begin();
while(current!=values.end())
{
    cout<<"X coord:"<<*current->x<<endl;//error: invalid type argument of unary ‘*’ (have ‘int’
    cout<<"Y coord:"<<*current->y<<endl;//error: invalid type argument of unary ‘*’ (have ‘int’
    current++;
}
}

4 个答案:

答案 0 :(得分:2)

更新

cout<<"X coord:"<<*current->x<<endl;
cout<<"Y coord:"<<*current->y<<endl;

为:

cout<<"X coord:"<<(*current).x<<endl;
cout<<"Y coord:"<<(*current).y<<endl;

cout<<"X coord:"<<current->x<<endl;
cout<<"Y coord:"<<current->y<<endl;

current是迭代器,如果你尝试取消引用它(* current),*current指向真实对象(x或y)是一个对象而不是指针,所以你需要调用{{1 }}。

如果你没有取消引用(*current).x迭代器,你可以调用current来引用真实对象。

另请注意,operator->operator->具有不同的优先级,请参阅C++ Operator Precedence

如果将operator*指针存储在std :: list中,则应使用迭代器:

XY

答案 1 :(得分:0)

使用* current将迭代器“转换”为它包含的对象。由于你有XY结构(不是指针而是值),你应该写:

cout<<"X coord:"<<(*current).x<<endl;
cout<<"Y coord:"<<(*current).y<<endl;

(“。”而不是“ - &gt;”)。

另一种方法是使用“ - &gt;”迭代器的运算符。它允许直接使用包含类型(结构或类)的成员。然后你需要写:

cout<<"X coord:"<<current->x<<endl;
cout<<"Y coord:"<<current->y<<endl;

只需删除'*'

即可

答案 2 :(得分:0)

迭代器有点像通用指针(它具有*->的相同语义。您正确使用->来访问迭代器指向的结构的成员。该成员的类型为int,因此没有任何内容可以取消引用。所以这样做:

cout<<"X coord:"<<current->x<<endl;
cout<<"Y coord:"<<current->y<<endl;

答案 3 :(得分:0)

错误“unary'*'的无效类型参数(包含'int')”来自以下表达式:*current->x。一元int的{​​{1}}论证是什么?好吧,*当然,如果你查看current->x的声明,你会发现它是x

所以,你可以写int,但这是乘法。解除引用的一元5 * current->x需要右侧的(智能)指针或迭代器。

请注意,*的优先级高于一元->,因此代码不会被解析为*,而是(*current)->x