Max*_*rai 2 c++ algorithm for-loop stl
我有一个对象矢量:
std::vector<Object> data;
Run Code Online (Sandbox Code Playgroud)
现在我需要调用Object::Foo()数据数组:
for (int i=0; i < data.size(); ++i) data[i].Foo(); // I think, the most slower
for (Object *it : data) it->Foo(); // And these are equal?
for (auto it=data.begin(); i!=data.end(); ++it) it->Foo();
Run Code Online (Sandbox Code Playgroud)
我知道这些方法,但现在我正在学习STL,我在for_each那里找到了:
for_each(data.begin(), data.end(), mem_fun(&Object::Foo));
Run Code Online (Sandbox Code Playgroud)
哪一个更好?换句话说,前两个示例更"基础",并且很容易理解普通开发人员的构造.
怎么样的STL算法的速度(for_each以mem_fun当前的情况下).我真的需要学习它吗?
使用合适的编译器时,不会有明显的性能差异.
for (int i=0; i < data.size(); ++i)
data[i].Foo();
Run Code Online (Sandbox Code Playgroud)
不慢,只是简介!简单的代码往往更快.在这种情况下,所有版本都同样简单
for (Object& it : data)
it.Foo();
Run Code Online (Sandbox Code Playgroud)
修复了你的问题:使用引用来避免不必要的复制(!).此外,这大致相当于:
{
auto curr = std::begin(data);
auto endit = std::end(data);
for (; curr != endit; ++curr)
curr.Foo();
}
Run Code Online (Sandbox Code Playgroud)
关于mem_fun/ mem_fun_ref和相关(bind_1st,negate等等),我建议你不要需要学习它们.阅读它们可能是有意义的,但C++ 11以更优雅的方式解决了这些"问题".
// using std::bind
for_each(data.begin(), data.end(), std::bind(&Object::Foo, _1));
// using lambdas
for_each(data.begin(), data.end(), [] (Object& o) { o.Foo(); });
Run Code Online (Sandbox Code Playgroud)
事实上,即使在C++ 03中,图书馆(如Loki,Boost Bind,Boost Lambda和最近的Boost Phoenix)也可以使其同样简洁.
| 归档时间: |
|
| 查看次数: |
786 次 |
| 最近记录: |