使用 emplacement 构造一个大小不变的矩阵向量

Using emplacement to construct a vector of matrices of constant size

我有一个矩阵 class(元素类型为 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 吗?

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

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

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

vec.emplace_back(rows, cols) 调用 n 次将实现您想要的结果,而无需对矩阵进行深度复制。你甚至可以reserve提前存储向量。

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

这里是 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);

而且它这样做相当有效。

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