【问题标题】:std::bind - vector as an argument in bound functionstd::bind - 向量作为绑定函数中的参数
【发布时间】:2016-03-14 14:30:07
【问题描述】:

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

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

#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();
}

【问题讨论】:

  • 您向我们展示的代码有什么问题?您是否只想对应该使用两个 std::bind 调用中的哪一个提出意见?
  • 是的,我想了解一下您的意见,哪种方法是绑定大量数据(例如 STL 容器)的最佳方法(从性能 POV 来看)。

标签: performance c++11 vector stl bind


【解决方案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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多