2013-04-23 175 views
2

我需要做一些特定的構造函數來獲取兩個迭代器:啓動迭代器和結束迭代器。迭代器和STL容器

我有一些代碼和它的作品:

#include <iostream> 
#include <vector> 

using namespace std; 

template<typename T> 
class A 
{ 
public: 
    T a[10]; 
    typename std::vector<T>::iterator itStart, itEnd; 
    A(typename vector<T>::iterator itStart, typename vector<T>::iterator itEnd):itStart(itStart),itEnd(itEnd){} 

    void see() 
    { 
     int i=0; 
     while(itStart != itEnd) 
     { 
      cout<<*itStart<<endl; 
      a[i] = *itStart; 
      itStart++; 
      i++; 
     } 
    } 
}; 

template <typename Iterator> 
double Sum(Iterator begin, Iterator end); 

int main() 
{ 
    cout << "Hello world!" << endl; 
    vector<int> v; 
    v.push_back(1); 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 


    class A<int> a(v.begin(),v.end()); 
    a.see(); 
    return 0; 
} 

但我想讓構造函數的參數與所有STL容器(如集,列表,地圖等),並與正常陣列(正常指針)工作。 那麼我可以用通用模板的方式嗎?類似的東西:

template<typename T> 
class A 
{ 
public: 
    iterator<T> itStart, itEnd; 
    A(iterator<T> itStart, iterator<T> itEnd):itStart(itStart),itEnd(itEnd){} 

    void see() 
    { 
     while(itStart != itEnd) 
     { 
      cout<<*itStart<<endl; 
      itStart++; 
     } 
    } 
}; 

我知道上面的代碼是錯誤的,但我想解釋我的想法。

當然,我可以重載構造函數,但我太懶了。太多的STL容器。 是一些模板方式來解決這個問題?

+0

我問是另一種方式來做到這一點。不解決我的懶惰。 – Aku 2013-04-23 13:53:55

+0

你希望'A'的成員'itStart'和'itEnd'是非特定的 - 是否正確? – 2013-04-23 13:54:26

+0

類似的東西,它們會被檢測到(Type Set,Map等)。當構建器調用 – Aku 2013-04-23 13:57:35

回答

1

顯然,你需要做的迭代器類型的模板參數類

template<class T, class Iter> 
class A 
{ 
    Iter first, last; 
    A(Iter first, iter last):first(first), last(last){} 
}; 

但現在它變得不舒服,明確指定模板參數

A<int, vector<int>::iterator > a; 

爲了避免這種情況,只需創建一個工廠功能

template<class T, class Iter> 
    A<T, Iter> make_A(Iter first, iter last) 
    { 
     return A<T, Iter>(first, last); 
    } 

現在,不是直接創建A的對象,你可以使用函數

auto my_A = make_A<int>(v.begin(), v.end()); 
+0

Ur的答案很不錯。這就是我需要的。謝謝 – Aku 2013-04-23 14:40:57

0

綜觀STL的東西,如std::fill之一:

template< class ForwardIt, class T > 
void fill(ForwardIt first, ForwardIt last, const T& value); 

我們可以得到啓發:

template<typename ITR, typename T> 
class A 
{ 
    A(ITR itStart, ITR itEnd):itStart(itStart),itEnd(itEnd){} 
    ... 
0

也許你可以利用輸入序列(iseq)的概念。

輸入序列由一對迭代器(begin和end)表示。

當然,您需要創建所有接受iseq而不是一對迭代器的STL算法的重載。

然後你的例子可以使用for_each(重載接受iseq)。

示例代碼可以在TC++ PL第3版(Stroustrup)第18.3.1節中找到。