だから、私の中にはstd::list<std::pair<int, std::string>>
というクラスがあります。このクラスのイテレータを実装して、このリストに含まれる文字列を反復処理する方法はありますか?コンテナの項目のフィールドに対してイテレータを作成するにはどうすればよいですか?
たとえば、私のクラスでは、a
,b
およびc
のフィールドを持つstruct
のベクトルを持っています。逆参照を行うと(b, c)
に対応するstd::pair
を返すイテレータを作成できますか(おそらくベクトルのイテレータを継承していますかわかりません)。
反復子とは、std::vector
のイテレーターのようなものです:whatever.begin()
経由で取得でき、前述のようにリスト内の文字列を反復することができます。
UPDわかりました、ここに私が欲しい情報があります。私のHashMap
クラスでは、私はitems
を持っています:structs
のリスト:それぞれがキー、値、それにテーブル内の場所へのポインタを持っています。私が必要とするのはイテレータです。私はitems.begin()
を実行して取得できるものではありません。この反復子は、逆参照されると、私の構造体を返します。ユーザーがHashMap.begin()
を呼び出したときに返すようなイテレーターが必要で、(key、value)に対応するstd::pair
に逆参照する必要があります。
これは、うまくいけば、私の質問を明確にするはずです。以下のための変換イテレータを使用するには
#include <iostream>
#include <list>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/iterator/transform_iterator.hpp>
int main() {
std::list<std::pair<int, std::string>> l;
auto extractor = [](auto&& elem) { return elem.second; };
// Using a transformed range.
for(auto&& v: l | boost::adaptors::transformed(extractor))
std::cout << v << '\n';
// Using transform iterators.
for(auto i = boost::make_transform_iterator(l.begin(), extractor), j = boost::make_transform_iterator(l.end(), extractor); i != j; ++i)
std::cout << *i << '\n';
}
:
template<class KeyType, class ValueType>
struct node {
KeyType key;
ValueType value;
node** place;
node(KeyType key_ = KeyType(), ValueType value_ = ValueType()): key(key_), value(value_) {};
};
任意のstruct defnitionsでは使用できません。これは、C++では利用できないランタイムリフレクションを必要とします。あなたはそれを使用する必要がある各具体的な構造体のために独自のイテレータ実装を提供することができます。そうするときには['std :: tie()'](http://en.cppreference.com/w/cpp/utility/tuple/tie)が便利です。 –
リスト内の文字列を繰り返し処理しますか? – Galik
あなたはそのようなイテレータが必要な理由について説明する必要があります。 – Holt