1

我有一个名为“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)?

谢谢。

4

2 回答 2

5

为 C 数组的包装器实现迭代器是微不足道的——只需分别返回指向 和 的第一个和最后一个元素的指针,并向beginPODend类添加非虚拟方法不会减慢很多任何东西。通过这些方法访问数组不会比使用数组索引查找慢,并且在某些情况下可能更快。如果您不使用它们,您的代码将不会运行得更慢。

作为一个优势,在 C++11 中,如果你有一个beginandend方法,std::begin并且std::end会找到它,并且for( auto x: container ) { /* code */ }会在你的类型上工作。

由于这似乎是一个 X/Y 问题,我怀疑您的问题之一是您根本不应该使用您的ntuple课程。 std::vector<double>已经是编写良好的 C 样式数组的薄包装器。要通过它而无需复制它,std::vector<double> const&.

顺便说一句,STL 是指派生模板组件的库stdstd它在几个方面与图书馆略有不同。

于 2013-05-18T21:34:23.633 回答
0

是的,使用向量,但是(如果你的内存中确实有很多数据)要非常小心地管理向量的内存。然后你真的会有这个 4 字节的开销(浪费了容量)。

  • 总是创建具有明确大小的向量,或创建空并使用 resize()
  • 使用索引填充向量(就像你做 vec[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() 方法访问

于 2013-05-18T22:16:31.480 回答