Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 利用侵位法构造常数矩阵向量_C++_C++11 - Fatal编程技术网

C++ 利用侵位法构造常数矩阵向量

C++ 利用侵位法构造常数矩阵向量,c++,c++11,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) { } matrixT( size\u type行数,//行数 size\u type cols//列数 ) : b

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

matrixT(
    size_type rows, // The number of rows
    size_type cols  // The number of columns
) :
    boost::numeric::ublas::matrix<Y>(rows, cols)
{
}
matrixT(
size\u type行数,//行数
size\u type cols//列数
) :
boost::numeric::ublas::矩阵(行、列)
{
}
(我在实际实现中使用boostblas,但这与本文无关)

我需要一个
std::vector
(对于
Y
a
double
),我知道我需要多少元素<代码>n,比如说。我也预先知道所有的尺码;它们都有
行和

我想做点像

std::vec向量(n,std::emplace(行,列))

因为我想避免对这些矩阵进行深度复制。我的理解是我可以强制调用构造函数;这就是
std::emplace(行、列)
的用途

然而,我不能得到正确的语法。有什么想法吗?我是否需要使用std::initialiser\u list


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

没有必要让
std::vector
有这样的构造函数

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

vec.emplace\u back(rows,cols)
调用
n
次将实现您想要的,而无需深入复制矩阵。您甚至可以提前
保留
矢量存储


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

这里有一个
emplace\u n
emplace\u create\u 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;
}
模板
空洞侵位(标准::向量和向量、大小、参数和参数){
if(向量容量()<向量大小()+n){
车辆储备((标准::最大值)(车辆容量()*3/2,车辆大小()+n));
}
对于(尺寸i=1;i
这使您可以通过放置而不是复制来创建n元素向量

std::vector<matrixT> vec = emplace_create_vector<matrixT>(n, rows, cols);
std::vector vec=emplace\u create\u vector(n,行,列);
而且这样做相当有效


每个<代码> vector < /COD>复制将被任何可接受的C++编译器所淘汰,不调用“代码> Matrix X< /CODE >的复制或移动构造函数。

我不确定我理解传递构造函数参数与向量元素之间的链接,避免深拷贝。我不想创建每个矩阵,然后<代码> PuxFuff< <代码>到向量。给出
matrixT
move语义,那么它真的不重要。或者
vec.emplace\u back(行、列)
n
次。我不知道任何函数
std::emplace
。是我的老板告诉porkies的吗?如果你能在建筑上做到这一点,我不想接受答案。@LightnessRacesinOrbit我不明白
移动
在这里有什么关系。你不能将一个参数移动到55个不同的参数:它必须复制。问题是
复制是(至少OP认为)比直接构造慢。我可以看出这在实践中是一个问题,直接构造可以使内存归零,而副本必须复制内存。不需要
模板
?我不知道,在我看来它似乎有一些实用性。通用模板不容易设计,你想如何处理它例如,使用右值参数窃取内容的传送者?作为旁白,
vector
需要一个不安全的
emplace\u-back
push\u-back
,调用者保证有足够的容量来容纳元素。我对该检查带来的不必要的性能影响感到恼火。这与最初的p无关奥斯特回答这个问题:在使用
int
或其他小型廉价类型时,性能影响主要是很重要的。任何一个好的cpu在容量限制方面都不会看到不安全的
push\u back
的改进。因为在
emplace\u n
中,测试结束时总是会有相同的结果,cpu分支预测也会出现100%隐藏成本。即使不隐藏,您也在推送一个对象,该对象至少为矩阵和“容量测试成本<分配成本”很大一部分。@galop1n是的,分支预测会成功。但是预测的分支不是免费的:相反,失败的分支是非常昂贵的。对于矩阵,这不是一个问题,我同意:但是对于像
int
这样的廉价对象,这确实意味着精心编写的
malloc
代码可以比
vector STD<代码>代码时,我试图找到使<代码> STD<代码>代码匹配或超过手工制作代码的方法。,则
推回
/
安置
检查的开销会很明显。是的,但是您发现使用了多少次
向量
,初始化为给定大小,并且从不使用任何可能调整数组大小的操作。只支付您需要的费用,而不支付您可能使用的费用。后面的示例使用
对来实现