【发布时间】:2015-05-22 20:01:14
【问题描述】:
我不确定是否应该在 StackOverflow 或 CodeReview 提出这个问题。但是因为找不到类似的问题,所以在这里发布。
ATM 我正在优化一个简单的图像处理应用程序的代码。
其中一个目标是为所有卷积效果类赋予它们各自的矩阵作为它们的私有变量。因为 const-correctness 这不是早先完成的,但是解决 const-correctness 引入的问题的快速修复并不是内存和 cpu 周期。
所以我决定使用 std::vector<std::vector<double>> 在类初始化级别初始化卷积矩阵,因为创建数十个构造函数以使每次使用 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-exception 和 what()-message:
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 类的值变量。按值更改 multidimensionalVector 复制并没有什么不同。
有人可以解释这里哪里和/或哪里出了问题吗?
(PS:我更喜欢用自己的话(也就是简单的英语)写答案,而不是直接从 C++ 标准文档中引用,因为使用了模糊和令人困惑的学术/科学语言)。
【问题讨论】:
-
如果它是一个真正的矩阵,那么创建一个一维向量并使用索引计算(x + y * 宽度)来查找元素会更有效。为方便起见,您可以将其包装在一个类中。
-
我们需要更多代码来帮助您。你能告诉我们你在哪里创建
BlurFilter,以及矩阵是如何传递给Matrix的构造函数的吗? -
实际上标准并没有使用“模糊”的语言。神秘的,也许吧。令人困惑,当然对某些人来说。抽象,地狱是的。但含糊不清。是冗长的英语含糊不清且易于解释。
-
在ideone.com/7VXnQk 工作正常。
-
你试过一个非常基本的回购吗?我刚做了一个,它工作正常。它只是一个在构造函数中接受向量向量的类,将其分配给私有成员,然后主要创建一个实例,传入一个初始化的(如您所拥有的)向量向量。
标签: c++ c++11 multidimensional-array vector initialization