C++中的前置递增(++it
)与后置递增(it++
)
1. 差别与实现
前置递增(++it
)
- 返回类型:返回一个引用。
- 效率:不会产生临时对象,因此效率更高。
- 实现代码:
class Iterator { public: // 前置递增运算符 Iterator& operator++() { // ++it *this += 1; return *this; } private: int value; };
后置递增(it++
)
- 返回类型:返回一个对象。
- 效率:必须产生临时对象,因此效率较低。
- 实现代码:
class Iterator { public: // 后置递增运算符 Iterator operator++(int) { // it++ Iterator temp = *this; *this += 1; return temp; } private: int value; };
2. 示例代码及详细注释
#include <iostream>
#include <vector>
class VectorIterator {
public:
VectorIterator(std::vector<int>::iterator it) : iter(it) {}
// 前置递增(高效)
VectorIterator& operator++() { // ++it
++iter;
return *this;
}
// 后置递增(低效)
VectorIterator operator++(int) { // it++
VectorIterator temp = *this; // 创建临时副本
++iter; // 进行实际递增操作
return temp; // 返回临时副本
}
int operator*() {
return *iter;
}
bool operator!=(const VectorIterator& other) {
return iter != other.iter;
}
private:
std::vector<int>::iterator iter;
};
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
VectorIterator it = v.begin();
VectorIterator end = v.end();
std::cout << "Using pre-increment (++it):" << std::endl;
for (VectorIterator it = v.begin(); it != end; ++it) { // 前置递增,效率高
std::cout << *it << " ";
}
std::cout << std::endl;
std::cout << "Using post-increment (it++):" << std::endl;
for (VectorIterator it = v.begin(); it != end; it++) { // 后置递增,效率低
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
总结
-
前置递增(
++it
)- 返回:引用。
- 效率:高,避免了临时对象的创建。
- 使用场景:推荐在大部分场景中优先使用。
-
后置递增(
it++
)- 返回:对象。
- 效率:低,因为需要创建临时对象。
- 使用场景:当需要在递增操作之前使用当前值的场景。
在实际编程中,由于前置递增更为高效,因此通常推荐在可行的情况下优先使用前置递增(++it
)