двунаправленный итератор буст-преобразования как с std :: map - PullRequest
2 голосов
/ 09 января 2012

Я использую transform_iterator для доступа к ключам (и отдельным значениям) map.

Но похоже, что это не сохраняет двунаправленность std::map::iterator ...

#include <map>

#include <iterator>
#include <assert.h>

#include <boost/iterator/transform_iterator.hpp>


typedef std::map<int,int> map;

template <typename Pt>
struct XFunc
{
    typedef typename Pt::first_type result_type;

    result_type& operator()(const Pt &p) { return p.first; }
};
typedef XFunc<map::value_type> xfunc;
typedef boost::transform_iterator<xfunc,map::iterator>  XIt; 

int main(int argc, char* argv[])
{
    map data;

    for (int i = 0; i < 10; ++i )
    {
        map::value_type pt( i, i * 2 );
        data.insert( pt );
    }

    map::iterator itend = data.end();

    map::iterator itlast = itend;
    std::advance(itlast,-1);

    assert(itend != itlast);  // succeeds !

    XIt xend = boost::make_transform_iterator(itend,xfunc());

    XIt xlast = xend;
    std::advance(xlast,-1);

    assert(xend != xlast); // fails !

    return 0;
}

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...