2016-04-04 38 views
1

私は、セントラルデータメンバーとしてSTL std::vectorを含むカスタムクラスを実装しています。 ここでは、このクラスがイテレータを提供することを望みます。このイテレータは、このベクトルを反復処理するだけで、C++ 11の範囲ベースの反復処理でも動作します。 まったく同じ仕事をすることになっているので、ちょうど何とかイテレータをstd::vector::iteratorから継承することは魅力的です。これは可能ですか、完全にカスタムのイテレータを実装する必要がありますか?カスタムクラスのためにstd :: vector :: iteratorを継承していますか?

class Custom { 
private: 
    std::vector<double> _data; 
public: 
    class iterator { 
    // Want this to provide an interface to iterate through _data 
    // ... 
    }; 
    // ... 
}; 

Custom C; 
// Populate C with data ... 
for (const auto& item : C) { 
    // This should print the elements within _data. 
    std::cout << item << std::endl; 
} 
+1

なぜ "継承":ここでは

は、迅速なスニペットのですか?単にtypedefでないのはなぜですか? 'class Custom {iterator = std :: vectorを使用しています。 :: iterator; '_data.begin()'と '_data.end()'に転送することによって 'begin()'と 'end()'を実装する必要があります –

答えて

1

:また

Custom custom; 

// here insert any data 

for(auto it = custom.cbegin(); it != custom.cend(); ++it){ 
    cout << *it; 
} 

、それがために範囲ベースのために動作します。 std::vector<double>で使用されるイテレータ用のインターフェイスを提供するだけです。

#include <vector> 
#include <iostream> 

class Custom { 
private: 
    std::vector<double> _data; 
public: 
    explicit Custom(std::initializer_list<double> init) : _data(init) {} 

    using iterator = std::vector<double>::iterator; 
    using const_iterator = std::vector<double>::const_iterator; 

    iterator begin() 
    { 
    return _data.begin(); 
    } 

    iterator end() 
    { 
    return _data.end(); 
    } 

    const_iterator cbegin() const 
    { 
    return _data.cbegin(); 
    } 

    const_iterator cend() const 
    { 
    return _data.cend(); 
    } 
}; 

int main() 
{ 
    Custom C({ 1.0,2.0,3.0,4.0,5.0 }); 
    for (const auto &item : C) 
    { 
    std::cout << item << "\n"; 
    } 

    return 0; 
} 
+0

ありがとうございます、これは主に私のために働いた。何らかの理由で私はオーバーロードされた 'const_iterator begin()const {return _data.cbegin();}を追加しなければなりませんでした。 } 'とそれに対応する' end() 'は、レンジベースのforループが自動的に' cbegin() 'メソッドに切り替えることはないためです。 – trypsilon

0

あなたはイテレータを作成

  • vector<T>::begin()
  • vector<T>::end()
  • vector<T>::cbegin()
  • vector<T>::cend()
  • および他のベクターのメンバ関数のために公共のプロキシ機能を行うことができます

そして、そのようなあなたのオブジェクトを反復処理:あなたは反復子自体から継承する必要はありません

for(const auto &val : custom){ 
    cout << val; 
} 
関連する問題