STL算法与普通代码

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_eachmem_fun当前的情况下).我真的需要学习它吗?

seh*_*ehe 5

使用合适的编译器时,不会有明显的性能差异.

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)

STL滑稽动作

关于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)也可以使其同样简洁.