繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM