与 std::map 一样的双向升压变换迭代器

发布于 2024-12-25 18:15:43 字数 1135 浏览 2 评论 0原文

我使用 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;
}

我做错了什么?

I'm using a transform_iterator to access keys (and separately values) of a map.

But it seems that it is not preserving the bi-directionality of 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;
}

What am I doing wrong ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文