我不确定是否应该在StackOverflow或CodeReview上询问此问题。但是因为我找不到类似的问题,我在这里发帖。
ATM我正在优化简单图像处理应用程序的代码。
其中一个目标是将所有卷积效果类的各自矩阵作为其私有变量。因为const-correctness没有提前完成,但是解决引入的const-correctness问题的quickfix并不是内存和cpu-cycles。
所以我决定使用std::vector<std::vector<double>>
在class-initializiation-level初始化convolutionMatrix,因为创建了几十个构造函数以使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构造函数中中断std::out_of_range
- 异常与what() - 消息:
what():vector :: _ M_range_check:__n(为0)&gt; = this-&gt; size()(为0)“
Aka 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类的values-variable。更改multidimensionalVector copy-by-value没有区别。
有人可以在这里解释哪里和/或出了什么问题?
(PS:我更喜欢用自己的语言写的答案(又名简明英语),而不是直接引用C ++标准文档,因为使用了模糊和混乱的学术/科学语言)。
答案 0 :(得分:2)
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;
}
答案 1 :(得分:1)
当我剥离和优化发布此问题的代码时,我似乎无意中修复了自己的问题。在发布之前我没有想过尝试简化的代码。
放
this->values = multidimensionalVector;
完成了这项工作。
Matrix-constructor的原始版本似乎引发了std::out_of_range
- 异常是这样的:
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和x之间,则x和y参数将始终被检查。&x; x&y;&amp;在-1和this-&gt; yLength之间。
但是,如果x和y参数与(然后未初始化的)this-&gt;值绑定在一起,则永远不会检查它们。