我得到了一些C++代码,它具有以下结构的列表/迭代器.
typedef struct{
int x;
int y;
}my_struct;
std::list<my_struct> the_list;
std::list<my_struct>::iterator the_iter = the_list.begin();
Run Code Online (Sandbox Code Playgroud)
然后代码以the_iter这种方式访问x和y :
(*the_iter).x;
(*the_iter).y;
Run Code Online (Sandbox Code Playgroud)
我想将这些更改为更易读的版本:
the_iter->x;
the_iter->y;
Run Code Online (Sandbox Code Playgroud)
从我的C角度来看,这对于指针解除引用来说完全没问题.迭代器也是如此吗?有没有理由说我的同事会用(*pointer).而不是p->
考虑到一般情况,可能会发生一些迭代器类没有提供operator ->,并且这样做(*it).x是唯一可行的方法.另一种可能性是,operator *并且operator ->具有一些非标准语义并且不可互换.但是,此类将无法满足任何迭代器概念,并且从技术上讲,它不会是迭代器.
在你的情况下,它是std::list<T>::iterator,it->x并且(*it).x是等价的.
这个答案有一个背景,为什么这两个方法都存在指针,如果它们实现相同的事情:https://stackoverflow.com/a/6632474/3113508
对于STL迭代器,您的更改将完全正常(并且可能是大多数人喜欢的),原因与->操作符通常优先用于指针一样.
但是,请注意,可以重载一元运算*符和运算符,->以在用户定义的类中提供语义上不同的行为.因此,可能有人可能选择使用*或->以不同的方式使用,这样foo->bar就不再相同了(*foo).bar.确保您熟悉所使用的类的文档.