![](/img/trans.png)
[英]How do I initialize a class member `std::vector` of `std::unique_ptr` object in the constructor initializer list?
[英]Initialize std::vector in class's initializer list
我不确定是否应该在StackOverflow或CodeReview上问这个问题。 但是由于找不到相似的问题,因此将其发布在此处。
ATM我正在优化简单图像处理应用程序的代码。
目标之一是为所有卷积效果类提供其各自的矩阵作为其私有变量。 因为const-correctness并没有更早完成,但是解决const-correctness引入的问题的快速修复在内存和cpu周期上并不是多余的。
因此,我决定在类初始化级别使用std::vector<std::vector<double>>
初始化convolutionMatrix,因为创建了数十个构造函数以使用std::array<std::array<double>,\\d+>,\\d+>
进行每次初始化std::array<std::array<double>,\\d+>,\\d+>
效率低下。
BlurFilter::BlurFilter() : ColorEffect(), convolutionMatrix(
std::vector<std::vector<double>>{
std::vector<double>{ 0.0, 0.0, 1.0, 0.0, 0.0 },
std::vector<double>{ 0.0, 1.0, 1.0, 1.0, 0.0 },
std::vector<double>{ 1.0, 1.0, 1.0, 1.0, 1.0 },
std::vector<double>{ 0.0, 1.0, 1.0, 1.0, 0.0 },
std::vector<double>{ 0.0, 0.0, 1.0, 0.0, 0.0 }
} )
{
}
然而。 该应用程序在运行时在Matrix构造函数中使用带有what()消息的std::out_of_range
-exception中断:
what():vector :: _ M_range_check:__n(0)> = this-> size()(0)“
又名multidimensionalVector.size()某种程度上是0。
Matrix::Matrix( const std::vector<std::vector<double>>& multidimensionalVector )
{
this->xLength = multidimensionalVector.size();
this->yLength = ( *multidimensionalVector.begin() ).size();
this->values = multidimensionalVector;
}
坦率地说,我当时不知道为什么multidimentsionalVector的大小根本为零,因为我正在传递初始化的矢量,这些矢量可能是-如所示-复制构造(或移动构造)到值- Matrix类的变量。 更改multiDimensionVector按值复制不会产生任何影响。
有人可以解释这里哪里和/或哪里出了问题吗?
(PS:由于使用了模糊和混乱的学术/科学语言,我宁愿用自己的话(也就是普通英语)写的答案,而不是直接从C ++标准文档中引用)。
FWIW,您可以大大简化代码。 这是一个有效的示例:
#include <iostream>
#include <vector>
struct Matrix
{
Matrix(const std::vector<std::vector<double>>& multidimensionalVector);
size_t xLength;
size_t yLength;
std::vector<std::vector<double>> values;
};
Matrix::Matrix( const std::vector<std::vector<double>>& multidimensionalVector ) : xLength(0), yLength(0), values(multidimensionalVector)
{
this->xLength = values.size();
std::cout << "xLength: " << xLength << std::endl;
if ( xLength > 0 )
{
this->yLength = ( *values.begin() ).size();;
}
std::cout << "yLength: " << yLength << std::endl;
}
struct BlurFilter
{
BlurFilter();
Matrix convolutionMatrix;
};
BlurFilter::BlurFilter() : convolutionMatrix( { { 0.0, 0.0, 1.0, 0.0, 0.0 },
{ 0.0, 1.0, 1.0, 1.0, 0.0 },
{ 1.0, 1.0, 1.0, 1.0, 1.0 },
{ 0.0, 1.0, 1.0, 1.0, 0.0 },
{ 0.0, 0.0, 1.0, 0.0, 0.0 } } )
{
}
int main()
{
BlurFilter f;
}
好吧,这让我很尴尬。
似乎我在剥离和优化代码以发布此问题时无意中解决了自己的问题。 在发布之前,我没有想到要尝试简化的代码。
推杆
this->values = multidimensionalVector;
做好了
似乎会引发std::out_of_range
-exception的Matrix构造函数的原始代码是这样的:
Matrix::Matrix( const std::vector<std::vector<double>>& multidimensionalVector )
{
this->xLength = multidimensionalVector.size();
this->yLength = ( *multidimensionalVector.begin() ).size();
for( int x = 0; x < this->xLength; x++ )
{
for( int y = 0; y < this->yLength; y++ )
{
this->set( x, y, multidimensionalVector.at( x ).at( y ) );
}
}
}
在Matrix::set(int x, int y, double newValue )
,始终检查x和y参数是否在-1和this-> xLength && -1和this-> yLength之间。
但是从不检查x和y参数是否与(然后未初始化)this-> values的范围内...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.