You must provide a function beginand endthat returns the corresponding iterator, which itself implements the operators ++, !=and *. Functions beginand endcan be free or members.
, , . std::vector::iterator, "" .
, IDMap :
class ItemIterator {
std::vector<Item>::iterator i;
public:
ItemIterator(std::vector<Item>::iterator i) : i(i) {}
ItemIterator & operator ++() { ++i; return *this; }
ItemIterator operator ++(int) { const_iterator old(*this); ++(*this); return old; }
bool operator!=(const ItemIterator &o) const { return i != o.i; }
const T & operator*() const { return i->mItem; }
};
using iterator = ItemIterator;
using value_type = T;
ItemIterator begin() const { return ItemIterator(mItems.begin()); }
ItemIterator end() const { return ItemIterator(mItems.end() ); }
" " , , , "" Item s, . -, .items().
:
class IDMap {
public:
struct ItemsAdaptor {
ItemsAdaptor(std::vector<Item>::iterator b,
std::vector<Item>::iterator e)
: b{b}, e{e}
{}
ItemIterator begin() const { return b; }
ItemIterator end() const { return e; }
private:
ItemIterator b, e;
};
ItemsAdaptor items() const {
return ItemsAdaptor(mItems.begin(), mItems.end());
}
};
:
IDMap<int> map = ...;
for (int i : map.items()) {
...
}