std :: bind - vector作为绑定函数中的参数

问题描述 投票:1回答:1

我有一个问题,哪种方式最好将向量转发到绑定函数?

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

#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();
}
performance c++11 vector stl bind
1个回答
1
投票

这实际上取决于你想对绑定函数做什么。

如果他们将被复制传递(超过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));
© www.soinside.com 2019 - 2024. All rights reserved.