说我有两种类型的矩阵:reg和稀疏。 我创建了一个抽象的父类" Matrix",上面的两个继承自" Matrix"。 我想创建一个抽象迭代器,以便" MatrixIterator"是父抽象类," RegMatrixIterator"," SparseMatrixIterator"继承它。所有6个班级都有。
RegMatrix保存一个矢量表示,SparseMatrix保存一个映射,该映射在索引对和值之间进行映射。
实现迭代器的最佳方法是什么?
答案 0 :(得分:1)
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) { [...] }
}
而不是SFINAE(std::enable_if
),您可能只是static_assert()
正确的矩阵类型
那么你的函数可能与另一个foo(some_arg)
不明确。