2011-07-08 48 views
0

爲什麼普通算法模板被設計爲接受兩個迭代器而不是這些迭代器對?考慮下面這個例子:接受兩個迭代器的模板

#include <iostream> 
#include <iterator> 
#include <vector> 

using namespace std; 

template <typename Range, typename OutputIterator> 
void copy2 (Range r, OutputIterator o) { 
    copy (r.first, r.second, o); 
} 

template <typename iter1, typename iter2> 
pair<typename iter1, typename iter2> Range(iter1 start, iter2 end) { 
    return make_pair(start, end); 
} 

int main() 
{ 
    vector<int> myvector; 
    myvector.push_back(3); 
    myvector.push_back(2); 
    myvector.push_back(1); 

    // ordinary algorithm template accepts two iterators 
    copy(myvector.begin(), 
     myvector.end(), 
     ostream_iterator<int> (cout,"\n")); 

    // this template accepts iterator Range 
    copy2(Range(myvector.begin(),myvector.end()), 
      ostream_iterator<int> (cout,"\n")); 
} 

什麼是副本的原因()比COPY2()更好[比COPY2其他()調用冗長]

編輯:我砍倒COPY2的冗長( ),如DeadMG所建議的那樣。

+0

把迭代器包裝成一對有什麼好處?我所看到的只是它需要更多的輸入和對類型的依賴。 –

+0

copy2()的詳細程度不是一個足夠好的理由嗎? –

+0

@Joe:這是真的,但可以用一點想象力輕鬆解決。 – Puppy

回答

1

真的嗎?沒有一個。標準庫只包含迭代器的概念,因爲據我所知,在標準化之前沒有人提出範圍。許多人認爲使用範圍可以大大提高。其次,您可以通過一些額外的預先寫好的鍋爐輕鬆提高#2的冗長度。

template<typename T> std::pair<typename T::const_iterator, typename T::const_iterator> all(const T& t) { 
    return std::make_pair(t.begin(), t.end()); 
} 
template<typename T> std::pair<typename T::iterator, typename T::iterator> all(T& t) { 
    return std::make_pair(t.begin(), t.end()); 
} 

copy2(all(myvector), ostream_iterator<int>(cout, "\n")); 
+0

謝謝你的回答! –

0

我把它看作保持簡單。除了copy2函數的較小簽名之外,將你的迭代器包裝在另一個容器中會給你帶來什麼? (就我個人而言,我看不出有什麼好處,所以它只是更多的代碼來編寫調用函數)

並看看您發佈的示例代碼,原始複製調用是(IMO )比copy2調用更可讀。

+0

這是,但它可以使一點想象力更清潔。 – Puppy

+0

是的,但是爲什麼?更多的代碼(甚至添加不必要的typedef)打開了更多錯誤的大門。函數(container.begin(),container.end())已經很清楚了,對於一般編程,我沒有看到將它包裝在「範圍」對象中的任何一點。想想你什麼時候開始在你的前向迭代器之上有逆向迭代器..更多的typedefs來創建。 (當然,在某些情況下,範圍可能不錯,在這種情況下,人們可以編寫像OPs copy2這樣的包裝函數,但我認爲這是例外情況,而不是常態) – MarkD

+0

交易所有的容器都是常態。處理範圍遠比處理迭代器更常見。如果處理範圍得到了優化,那麼每個人都會獲得顯着的收益。 – Puppy

0

我認爲它是如此,如果你已經有了一個迭代器,你不必建造一對叫算法,而且它使所有參數的算法是一致的:某些類型的迭代器(並可能是一個謂詞)。

+0

但是,如果你已經有一對,並只能通過參考? –

0

copy2有一點額外的開銷,必須從你的兩個迭代器構造一對。它可能並不多,但如果沒有必要,就沒有理由添加額外的計算。

此外,保持代碼儘可能容易理解的好處不應低估。

+2

沒有任何像樣的編譯器。 – Puppy