I want to use a transform_iterator to make a delta transformation on a range. By delta transformation I mean that r0 should stay the same and the subsequent elements, ri, are mapped to (ri - ri - 1).
我的问题是,据我所知,transform_iterator 需要一个 const 函子,但我的函子需要记住以前的值。我该如何解决这个问题?我应该编写自己的迭代器吗?
我希望它作为迭代器的原因是,在下一步中我想从中创建一个范围适配器。
编辑:
看来transform_iterator确实允许非常量函子,而且确实是我的范围适配器抱怨缺乏常量。我将保持这个问题的开放性,因为关于使用transform_iterator 是否合适的讨论似乎很有趣。
我认为你不能使用 boost::transform_iterator 完全正确地完成这项工作。这是一个简单的实现,乍一看似乎可以工作,但实际上效果不佳:
#include <boost/iterator/transform_iterator.hpp>
#include <vector>
#include <iostream>
using std::cout;
struct Delta {
Delta() : prev_value(0) { }
int operator()(int value) const
{
int result = value-prev_value;
prev_value = value;
return result;
}
mutable int prev_value;
};
int main(int,char**)
{
typedef std::vector<int> Items;
typedef boost::transform_iterator<Delta,Items::iterator,int> Iter;
Items items;
items.push_back(4);
items.push_back(3);
items.push_back(8);
{ // prints 4 -1 5 -- excellent
Iter i(items.begin(),Delta()), end(items.end(),Delta());
for (;i!=end;++i) {
cout << *i << " ";
}
cout << "\n";
}
{ // prints 4 0 -- crap
Iter i(items.begin(),Delta());
cout << *i << " ";
cout << *i << "\n";
}
return 0;
}
为了真正做到这一点,您需要知道迭代器何时高级,所以我认为您需要自己的迭代器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)