簡體   English   中英

即使不需要時也實現迭代器? C ++

[英]Implement Iterators Even When Not Needed? C++

我有一個名為“ 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)?

謝謝。

為圍繞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庫在某些方面略有不同。

是的,請使用矢量,但是(如果您確實有很多數據在內存中)請非常小心地管理矢量的內存。 然后,您實際上將有這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()方法進行訪問

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM