与 std::map 一样的双向升压变换迭代器
我使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论