【发布时间】:2016-12-14 08:18:07
【问题描述】:
性能/安全检查是否有任何差异 使用
的向量元素- 带有迭代器的for循环
对比
- std:find_if(...)?
1. for循环
// 1. for loop
for (llvm::SmallVectorImpl<myClass>::const_iterator it = v.begin();
it != v.end();
++it) {
if (it->getName() == Name) {
// found element
// do smth...
break;
}
}
对比
2。 std:find_if
// 2. find if
llvm::SmallVectorImpl<myClass>::const_iterator it
= std::find_if(v.begin(),
v.end(),
StringCheck<llvm::StringRef>(Name));
if (it != v.end()) {
// found element
// do smth...
}
// StringCheck defined in header...
template <class T>
struct StringCheck{
StringCheck(const T &s) : s_(s) {}
bool operator()(const myClass &obj) const
{
return obj.getName() == s_;
}
private:
const T &s_;
};
【问题讨论】:
-
“安全”没有什么不同。对于性能,您必须进行基准测试。
-
最终,
std::find_if将迭代向量,所以我猜没有性能差异。 -
那里may be a performance difference either way. 任何这样的差异都小到足以成为过早的优化,除非您实际上已将循环确定为瓶颈,并且在这种情况下,您需要自己进行分析。
-
真正我能看到的唯一区别是迭代器循环会找到所有情况,除非您使用中断,
find_if将在第一次出现时隐式停止。 -
你认为
std::find_if是如何实现的——黑魔法?实际上,您无需猜测 - 您可以查看实现,它与您的编译器一起提供。你会在那里找到一个带有迭代器的循环。