【发布时间】:2016-05-17 09:22:38
【问题描述】:
假设我有这两个std::vector:
std::vector<int> v_int(1000);
std::vector<T> v_T(1000); // Where T is copy-costy type
如果我需要(单独)循环浏览它们而不需要编辑我可能使用的项目:
for(const auto item:v_int){
//...
}
for(const auto& item:v_T){ //Note &
//...
}
使用const auto item:v_T 进行迭代太糟糕了,因为每次迭代都会执行一个副本。然而,使用const auto& item:v_int 不是最佳的,但也不是那么糟糕。因此,如果我需要一个同时处理它们的代码,我曾经使用const auto& item:v。
问题:是否有一种通用的方式来编写 for 循环,它会为它们两者使用最好的声明?比如:
template <typename T>
void iterate(const std::vector<T> v){
for(const auto/*&*/ item:v){ // activate & if T is not elementary type
//...
}
}
【问题讨论】:
-
在 T 是原始类型的情况下,您希望避免引用的任何具体原因?
-
这种增加的复杂性真的值得为内置类型使用值而不是引用语义而付出努力吗?
-
为什么不使用普通的迭代器循环,问题就消失了。
-
你有没有测试过
const int&实际上比int慢?我猜智能编译器会为两者生成相同的代码。 -
@HumamHelfawi 我认为最好的做法是编写清晰的代码,并且在发现真正的性能问题之前不要进行微优化。