1

フラット配列を使用してデータを格納するが、そのデータをペアで反復処理するコンテナーを C++ で実装しようとしています。これで、コンテナーがベクトルを保持するように実装を簡単に変更できますが、std::pair要素 0 または要素 1 から始まるペアを反復処理したいと考えています。

達成したいことを説明するために、基になる配列が次のようになっている場合: 1,2,3,4,5,6,7,8

2 つのイテレータを定義します。1 つはペア (1,2)、(3,4)、(5,6)、(7,8) を返し、2 番目のイテレータはペアを返します: (2,3) , (4,5), (6,7)

イテレータの要素を基になる配列の参照にすることを許可しながら、これを行うことは可能ですか?

4

3 に答える 3

3

要素を反復処理する独自の反復子を作成することができます。次の質問は、それがどのように行われるかについてのいくつかの説明を示しています: Custom Iterator in C++ .

その後、目的の値を std::pair として返し、次の要素ペアに反復できます (カウンターを 2 ずつインクリメントします)。

于 2013-10-29T10:51:22.780 に答える
2

Boost ライブラリには、他のイテレータ タイプをラップし、それらの機能を変更または適応できるイテレータ アダプタがあります。目的に合わせて使用​​する方法は次のとおりです。

#include <boost/iterator/iterator_adaptor.hpp>
#include <vector>

struct iterator :
    public boost::iterator_adaptor<
        iterator,                    // the name of our class, see docs for details
        std::vector<int>::iterator,  // underlying base iterator
        std::pair<int&, int&>,       // our value type
        boost::forward_traversal_tag // the category you wish to give it
    >
{
     // need this to convert from vector::iterator to ours
    explicit iterator(std::vector<int>::iterator i)
        : iterator::iterator_adaptor_(i) {}

    value_type operator*()
    {
        return value_type(
            *base_reference(),
            *(base_reference()+1)
        );
    }
};

使用例:

std::vector<int> v {1,2,3,4};
iterator it(v.begin());
++it;
(*it).first = 0;  // TODO: operator->
(*it).second = 0;

for (int i : v) std::cout << i << ' '; // prints 1 0 0 4

また、終了条件などを適切に処理するには、比較をオーバーライドする必要があります。

于 2013-10-29T11:12:36.820 に答える