假设我有两种类型的矩阵: reg和sparse。我创建了一个抽象的父类"Matrix",上面的两个继承自"Matrix“。我想创建一个抽象迭代器,这样"MatrixIterator“是父抽象类,"RegMatrixIterator","SparseMatrixIterator”继承自它。总而言之,6个班级。
RegMatrix保存向量表示,SparseMatrix保存在索引对和值之间映射的映射。
实现迭代器的最佳方式是什么?
发布于 2014-09-01 17:15:14
iterator是一种抽象元素实际存储方式细节的通用机制。由于通用的面向对象编程( OOP )不能很好地协同工作,迭代器通常不会通过OOP实现。
我不知道你为什么要为你的Matrix使用OOP,也就是说,你是否真的想在矩阵上使用运行时多态性。如果这真的很重要,那么您将需要多态的Matrix::begin()和Matrix::end(),因此需要多态的Matrix::iterator。使用这样的矩阵的代码将如下所示
#include <Matrix.hpp>
void foo(Matrix const&m)
{
for(a : m) { [...] }
}但是,对于Matrix::iterator的多态方法的每次调用,您都需要付出虚拟函数调用(虚拟表查找)的代价。如果这不是性能关键型的,这种类型的设计是可以的,尽管对于迭代器来说并不常见。
但是,我更喜欢泛型编程方法,即这两种矩阵类型可以从公共基础派生,但不是为了运行时多态性的目的。然后每种类型只有它自己的迭代器类型和它自己的非虚拟begin()和end()。使用这样的矩阵的代码将如下所示
#include <Matrix.hpp>
template<typename Matrix>
typename std::enable_if<is_Matrix<Matrix>::value>:: // is_Matrix defined in Matrix.hpp
type foo(Matrix const&m)
{
for(x : m) { [...] }
}您可以简单地static_assert()正确的矩阵类型,而不是SFINAE (std::enable_if),尽管这样您的函数可能与另一个foo(some_arg)有歧义。
https://stackoverflow.com/questions/25600531
复制相似问题