2015-12-09 50 views
1

我有一个问题,哪种方式最好将向量转发到绑定函数?std :: bind - vector作为绑定函数中的参数

下面是两种方法的代码。在生产代码向量中将包含大量的数据,我想尽可能避免复制它。

我会很乐意提供任何提示和解释。谢谢。

#include <iostream> 
#include <vector> 
#include <functional> 

void foo(const std::vector<uint16_t>& v) 
{ 
    for(const auto& c : v) 
    { 
     std::cout << c; 
    } 

    std::cout << std::endl; 
} 

int main() 
{ 
    std::vector<uint16_t> vv{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; 

    auto f1 = std::bind(&foo, vv); // 1) 
    auto f2 = std::bind(&foo, std::move(vv)); // 2) 

    f1(); 
    f2(); 
} 
+1

你有什么问题,你有代码,你告诉我们?你只是想对你应该使用哪两个'std :: bind'调用发表意见? –

+0

是的,我想阅读您的意见,哪种方法是最好的(从性能POV)绑定大量的数据 - 如STL容器。 – user2311165

回答

0

这真的取决于你想要对绑定函数做什么。

如果他们要复制传递(超过vv的寿命),这是正确的(并且将复制vv)。

auto f1 = std::bind(&foo, vv); // 1) 

这也是正确的,(vv不会至少在最初复制。)

auto f2 = std::bind(&foo, std::move(vv)); // 2) 

,但你不会有一个点之后进入vv

但是,这是最可能的情况,我可以从你的例子推断: 如果绑定功能将在本地使用,而vv还活着,这是你想要f3举行一个希望的例子更有可能“参考“到vv。这与ref惯例完成:

auto f3 = std::bind(&foo, std::ref(vv)); 
相关问题