在类的初始化列表中初始化std :: vector

时间:2015-03-19 15:47:13

标签: c++ c++11 multidimensional-array vector initialization

我不确定是否应该在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 ++标准文档,因为使用了模糊和混乱的学术/科学语言)。

2 个答案:

答案 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;值绑定在一起,则永远不会检查它们。