[英]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數組的包裝器實現迭代器很簡單-只需分別返回指向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
庫在某些方面略有不同。
是的,請使用矢量,但是(如果您確實有很多數據在內存中)請非常小心地管理矢量的內存。 然后,您實際上將有這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()方法進行訪問
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.