Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 输入迭代器-星型和后缀运算符_C++_Iterator - Fatal编程技术网

C++ 输入迭代器-星型和后缀运算符

C++ 输入迭代器-星型和后缀运算符,c++,iterator,C++,Iterator,在输入迭代器上执行此操作是否有效 我对代码的理解如下,它取消了对迭代器的引用,给了我值,然后向前一步 在C++引用中**运算符低于后缀操作符: 但我读到这种风格是不好的做法。为什么? 在输入迭代器上执行此操作是否有效 是的,这是有效的。迭代器将递增,返回其上一个值,并且您将取消引用返回的迭代器 但我读到这种风格是不好的做法。为什么? 考虑一下这两个实现,我刚刚从我不久前编写的一些图形代码中提取出来: // Pre-increment BidirectionalIterator& oper

在输入迭代器上执行此操作是否有效

我对代码的理解如下,它取消了对迭代器的引用,给了我值,然后向前一步

<>在C++引用中**运算符低于后缀操作符:

但我读到这种风格是不好的做法。为什么?

在输入迭代器上执行此操作是否有效

是的,这是有效的。迭代器将递增,返回其上一个值,并且您将取消引用返回的迭代器

但我读到这种风格是不好的做法。为什么?

考虑一下这两个实现,我刚刚从我不久前编写的一些图形代码中提取出来:

// 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例如。