使用 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_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);
而且它这样做相当有效。
上面的每个 vector
副本都将被任何可接受的 C++ 编译器删除,并且不会调用 matrixT
的复制或移动构造函数。
我有一个矩阵 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_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);
而且它这样做相当有效。
上面的每个 vector
副本都将被任何可接受的 C++ 编译器删除,并且不会调用 matrixT
的复制或移动构造函数。