使用安置来构造恒定大小的矩阵向量

时间:2015-01-14 15:47:26

标签: c++ c++11

我有一个矩阵类(元素类型为Y),它与其他构造函数一起具有以下构造函数:

matrixT(
    size_type rows, // The number of rows
    size_type cols  // The number of columns
) :
    boost::numeric::ublas::matrix<Y>(rows, cols)
{
}

(我使用boost BLAS进行实际实现,但这里没有相关内容。)

我需要std::vector<matrixT>这个(Y一个double),我知道我需要多少元素; n,比方说。我也事先知道所有尺寸;所有人都有rows行和cols

我想做一些像

这样的事情

std::vector<matrixT> vec(n, std::emplace(rows, cols))

因为我想避免对这些矩阵进行深层复制。我的理解是我可以做某事来强制调用构造函数;这是std::emplace(rows, cols)的用途。

但是我无法正确理解语法。有任何想法吗?我需要使用std::initialiser_list吗?

(如果我的术语不正确,请随时告诉我,或编辑问题。)

2 个答案:

答案 0 :(得分:4)

std::vector不需要这样的构造函数。

它已经提供了一个名为emplace_back的方法。 emplace_back的参数应该与您的一个构造函数的参数匹配。

vec.emplace_back(rows, cols)调用n次将达到您想要的效果,而无需深入复制矩阵。您甚至可以提前reserve向量存储。

std::initializer列表 - 注意拼写 - 用于大括号初始化;一个不同的主题。)

答案 1 :(得分:2)

以下是emplace_nemplace_create_vector

template<class... Ts,class...Args>
void emplace_n( std::vector<Ts...>& vec, size_t n, Args&&... args ) {
  if (vec.capacity() < vec.size() + n ) {
    vec.reserve( (std::max)(vec.capacity()*3/2, vec.size()+n) );
  }
  for (size_t i = 1; i < n; ++i) {
    vec.emplace_back(args...);
  }
  if (n)
    vec.emplace_back(std::forward<Args>(args)...);
}

template<class...Ts,class...Args>
std::vector<Ts...> emplace_create_vector( size_t n, Args&&... args ) {
  std::vector<Ts...> retval;
  emplace_n( retval, n, std::forward<Args>(args)... );
  return retval;
}

live example

这使你可以通过安置来创建一个n元素向量,而不是复制。

std::vector<matrixT> vec = emplace_create_vector<matrixT>(n, rows, cols);

并且它合理有效。

任何可接受的C ++编译器都会删除上面的每个vector副本,并且不会调用matrixT的复制或移动构造函数。