即使不需要也可以实现迭代器? C ++

时间:2013-05-18 21:12:17

标签: c++ stl iterator

我有一个名为“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),代价是放慢我的代码?

感谢。

2 个答案:

答案 0 :(得分:5)

为C数组周围的包装器实现迭代器是微不足道的 - 只需返回指向beginend的第一个和最后一个元素的指针,并添加非 - POD类的虚拟方法不会减慢很多东西。通过这些方法访问数组不会比使用数组索引查找慢,并且在某些上下文中可以更快。如果你不使用它们,你的代码将不会运行得慢。

作为一个优势,在C ++ 11中,如果您使用beginend方法,std::beginstd::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字节的开销(浪费容量)。

  • 始终创建具有显式大小的向量,或创建为空并使用resize()
  • 使用索引填充矢量(正如你所做的那样[0] = ...)
  • 从不使用push_back - 它可以请求(两次)比所需更多的内存

您也可以使用继承向量来强制执行此规则(尽管有时不推荐这种做法),例如

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()方法访问

迭代器