我有一个名为“ntuple”的容器,它本质上是一个C数组和长度。它的主要目的是成为多维数学函数的论证。截至目前,它真的很快并且使用了几种形式的构造函数
ntuple(double x, double y, double z)
{
size = 3;
vec = new double[size];
vec[0] = x;
vec[1] = y;
vec[2] = z;
}
每次我使用更高维度但已知的函数时,我只需添加一个新的构造函数。我也有一个阵列:
ntuple(double* invec, long unsigned insizesize)
为了使我的代码与常规c ++代码更兼容,我应该实现一个ntuple迭代器类吗?我所做的一切都不需要,看起来它只会减慢一切。但是我读的越多,为了与标准C ++代码兼容,使用迭代器似乎就越重要。
我担心当有人试图使用我的代码时,它将无法与他们期望使用的标准技术很好地融合。但是我的ntuple类的目的只是将参数带入函数。
我是否应该作为预防措施实现迭代器(如果其他人会尝试在其上使用STL),代价是放慢我的代码?
感谢。
答案 0 :(得分:5)
为C数组周围的包装器实现迭代器是微不足道的 - 只需返回指向begin
和end
的第一个和最后一个元素的指针,并添加非 - POD类的虚拟方法不会减慢很多东西。通过这些方法访问数组不会比使用数组索引查找慢,并且在某些上下文中可以更快。如果你不使用它们,你的代码将不会运行得慢。
作为一个优势,在C ++ 11中,如果您使用begin
和end
方法,std::begin
和std::end
会找到它,for( auto x: container ) { /* code */ }
将适用于您的类型。
由于这似乎是一个X / Y问题,我怀疑你的一个问题是你根本不应该使用你的ntuple
课程。 std::vector<double>
已经是一个很好写的C风格数组的薄包装器。要传递它而不需要复制它,std::vector<double> const&
。
除了迂腐之外,STL指的是std
的模板组件派生自的库。它在某些方面与std
库略有不同。
答案 1 :(得分:0)
是的,使用vector但是(如果你的内存中有很多数据)要非常小心地管理vector的内存。那么你真的会有这个4字节的开销(浪费容量)。
您也可以使用继承向量来强制执行此规则(尽管有时不推荐这种做法),例如
class ntuple: public std::vector<double> {
private:
typedef std::vector<double> super;
void push_back(double); // do not implement
// also forbid pop_back()
public:
ntuble(double a, double b) {
resize(2);
(*this)[0] = a;
(*this)[1] = b;
}
ntuple(double* invec, long unsigned size)
: super(invec, invec + size)
{
}
// all your other convenient constructors here
};
仍然可以使用begin()和end()方法访问迭代器