std::bind - 向量作为绑定函数中的参数
std::bind - vector as an argument in bound function
我有一个问题,将向量转发到绑定函数的最佳方式是什么?
下面是包含两种方法的代码。在生产代码向量中将包含大量数据,我想尽可能避免复制它。
#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();
}
这真的取决于你想用绑定函数做什么。
如果它们要被复制传递(超过vv
的生命),这是正确的(并且要复制vv
)。
auto f1 = std::bind(&foo, vv); // 1)
这也是正确的,(vv
至少最初不会被复制。)
auto f2 = std::bind(&foo, std::move(vv)); // 2)
但在那之后您将无法访问 vv
。
然而,这是我可以从您的示例中推断出的最有可能的情况:
如果绑定函数将在本地使用,而 vv
仍然存在,则更有可能是希望 f3
持有 "reference" 到 vv
的示例。这是通过 ref
约定完成的:
auto f3 = std::bind(&foo, std::ref(vv));
我有一个问题,将向量转发到绑定函数的最佳方式是什么?
下面是包含两种方法的代码。在生产代码向量中将包含大量数据,我想尽可能避免复制它。
#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();
}
这真的取决于你想用绑定函数做什么。
如果它们要被复制传递(超过vv
的生命),这是正确的(并且要复制vv
)。
auto f1 = std::bind(&foo, vv); // 1)
这也是正确的,(vv
至少最初不会被复制。)
auto f2 = std::bind(&foo, std::move(vv)); // 2)
但在那之后您将无法访问 vv
。
然而,这是我可以从您的示例中推断出的最有可能的情况:
如果绑定函数将在本地使用,而 vv
仍然存在,则更有可能是希望 f3
持有 "reference" 到 vv
的示例。这是通过 ref
约定完成的:
auto f3 = std::bind(&foo, std::ref(vv));