c++ - 如何避免在提升范围变换中复制

标签 c++ c++11 move-semantics boost-range

提升范围转换需要 const & 作为参数范围。

#include <iostream>
#include <vector>
#include <boost/range/algorithm.hpp>

int main(int argc, char *argv[])
{
  using namespace std;

  vector<vector<int>> rt0(10,vector<int>(15,2));
  vector<vector<int>> irt(10,vector<int>(15,5));

  for(auto & i:rt0) {
    for(auto& j:i) cout << j << "  ";
    cout << "\n";
  }
  cout << "\n";
  for(auto & i:irt) {
    for(auto& j:i) cout << j << "  ";
    cout << "\n";
  }

  boost::transform(rt0,irt,rt0.begin(),
    [] (const vector<int> &t0,const vector<int> &it) {
      auto tt = t0;
      boost::transform(t0,it,tt.begin(), plus<int>());
      return tt;
    }
  );
  cout << "\n";
  cout << "\n";
  for(auto & i:rt0) {
    for(auto& j:i) cout << j << "  ";
    cout << "\n";
  }
  return 0;
}

编译运行

g++ -std=c++11 main.cc; ./a.out

如果 boost::transformBinaryOperationSinglePassRange1 使用 & 而不是 const & 那么我就不需要创建一个拷贝 (auto tt = t0),只需使用 to 而不是 tt。有没有办法避免创建此复制(同时仍在使用范围)?

提升范围转换的链接:http://www.boost.org/doc/libs/1_53_0/libs/range/doc/html/range/reference/algorithms/mutating/transform.html

最佳答案

我需要将 for_each 与元组或采用两个参数的新 boost 实现一起使用。

概念上 transform 不应修改。它来自没有就地修改的函数式编程。

关于c++ - 如何避免在提升范围变换中复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15247026/

相关文章:

c++ - 我应该如何编写函数参数来执行 move 而不是复制?

c++ - 如何获得 n 嵌套 vector 的最内层类型?

C++父类方法调用

c++ - 如何禁止赋值

c++ - 延迟函数模板实例化

c++ - move 语义与常量引用

Android.mk 相对路径还是绝对路径?

c++ - 给定一个微秒值,如何准确得到一个timeval结构?/*UPDATE GETTING NEGATIVE VALUE*/

c++ - 是什么让 dynamic_cast 开始抛出 std :bad_cast even if invoked on pointers?

c++ - 实用的 r 值引用