【问题标题】:STL algorithms such as for_each applied to more than one argumentsfor_each 等 STL 算法应用于多个参数
【发布时间】:2012-03-29 15:29:08
【问题描述】:

是否可以编写类似于mem_funbind1st 等的内容,以便将for_each 等STL 算法应用于多个参数?当然,除了一个参数外,所有参数都给出,没有的将由容器元素填充。

谁能举个例子?

【问题讨论】:

    标签: c++


    【解决方案1】:

    您正在寻找的是std::bind 或其孪生boost::bind。它们是这样使用的:

    std::vector<int> v = {1,2,3,4};
    std::transform(begin(v), end(v), begin(v), std::bind(std::plus<int>(), _1, 23 ));
    

    还可以查看尽可能多的错误迭代方式https://stackoverflow.com/a/8378613/105672

    【讨论】:

    • 我明白了。是在c++11的stl里吗?
    • @littleEinstein - std::bind 是 C++11 的一部分。如果你不能使用它,你可以从boost使用它。
    • std::bind 也在 C++03 中,而 boost::bind 在 boost 中(你应该拥有或获得)。
    【解决方案2】:

    在我看来,Lambda 更清晰。 pmr 使用 lambda 而不是 std::bind 的示例:

    std::vector<int> v = {1,2,3,4};
    std::transform(begin(v), end(v), begin(v), [](int n) { return n + 23 });
    

    Lambdas 还可以轻松处理绑定和朋友比较困难的情况,例如:

    std::transform(begin(v), end(v), begin(v), [](int n) { return n * ((double)rand() / RAND_MAX); });
    

    【讨论】:

    【解决方案3】:

    在 C++11 中,您也可以执行 @pmr 以这种方式发布的相同操作:

    std::vector<int> v = {1,2,3,4};
    std::transform(begin(v), end(v), begin(v), [](int _1) { return _1 + 23} );
    

    将此与@pmr 的解决方案进行比较。

    请注意,@pmr 解决方案中的_1 成为我的解决方案中 lambda 的参数。当然,您可以(事实上,应该)使用更好的名称;我使用了_1,以便您可以比较和理解符号的含义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      相关资源
      最近更新 更多