C++ 输入迭代器-星型和后缀运算符
在输入迭代器上执行此操作是否有效 我对代码的理解如下,它取消了对迭代器的引用,给了我值,然后向前一步 <>在C++引用中**运算符低于后缀操作符: 但我读到这种风格是不好的做法。为什么? 在输入迭代器上执行此操作是否有效 是的,这是有效的。迭代器将递增,返回其上一个值,并且您将取消引用返回的迭代器 但我读到这种风格是不好的做法。为什么? 考虑一下这两个实现,我刚刚从我不久前编写的一些图形代码中提取出来:C++ 输入迭代器-星型和后缀运算符,c++,iterator,C++,Iterator,在输入迭代器上执行此操作是否有效 我对代码的理解如下,它取消了对迭代器的引用,给了我值,然后向前一步 在C++引用中**运算符低于后缀操作符: 但我读到这种风格是不好的做法。为什么? 在输入迭代器上执行此操作是否有效 是的,这是有效的。迭代器将递增,返回其上一个值,并且您将取消引用返回的迭代器 但我读到这种风格是不好的做法。为什么? 考虑一下这两个实现,我刚刚从我不久前编写的一些图形代码中提取出来: // Pre-increment BidirectionalIterator& oper
// Pre-increment
BidirectionalIterator& operator++()
{
edge = (edge->*elem).next;
return *this;
}
// Post-increment
BidirectionalIterator operator++(int)
{
TargetIterator oldval(list, edge);
edge = (edge->*elem).next;
return oldval;
}
注意,对于post increment,我需要首先构造一个新的迭代器来存储将返回的前一个值
如果使用pre-increment编写程序简单明了,那么可能会有更好的性能,编译器需要做的工作更少,或者两者兼而有之
只是不要为此发疯(例如,重写所有循环)!这可能是微观优化。然而,人们之所以说这是一种好的做法,是因为如果你养成了使用pre-increment作为默认值的习惯,那么默认情况下你(可能)会获得更好的性能。因为postfix
++
应该先记录上一个状态,然后再记录self-plus,与prefix++
相比,还有一些额外的工作要做。这就是为什么建议在foo
循环中使用++i
的原因。我不认为这是不好的风格,这是一个常见的习惯用法。类似于从一个数组复制到另一个数组的循环中的*dest++=*src++
。@Barmar表示指针是,但迭代器上的预增量一直是一个首选项,因为至少对某些迭代器而言,后增量的成本要高得多。@AlanStokes不会跳过第一个元素并尝试在结束后取消引用吗?@Barmar您确实需要适当地重写<代码>*dest=*src++目的地++src代码>例如。