2015-12-09 51 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)); 
相關問題