我有一个矩阵类(元素类型为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
吗?
(如果我的术语不正确,请随时告诉我,或编辑问题。)
答案 0 :(得分:4)
std::vector
不需要这样的构造函数。
它已经提供了一个名为emplace_back
的方法。 emplace_back
的参数应该与您的一个构造函数的参数匹配。
vec.emplace_back(rows, cols)
调用n
次将达到您想要的效果,而无需深入复制矩阵。您甚至可以提前reserve
向量存储。
(std::initializer
列表 - 注意拼写 - 用于大括号初始化;一个不同的主题。)
答案 1 :(得分:2)
以下是emplace_n
和emplace_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;
}
这使你可以通过安置来创建一个n元素向量,而不是复制。
std::vector<matrixT> vec = emplace_create_vector<matrixT>(n, rows, cols);
并且它合理有效。
任何可接受的C ++编译器都会删除上面的每个vector
副本,并且不会调用matrixT
的复制或移动构造函数。