我想编写一个能够返回一系列迭代器的方法,以表示更大列表的子集。
这样的“子集”不能由连续的对象组成吗?
例如,如果我有一个带有n个对象的std :: list。
例如
| object1 | object2 | object3 | object4 | ... | objectn
我可以返回一系列迭代器(一对开始/结束我们可以调用ItBegin和ItEnd),它们只包含Object 1,3和4吗?
例如
| object1 | object2 | object3 | object4 | ... | objectN
^ ^ ^ ^
| | | |
ItBegin ++ItBegin ++ItBegin ItEnd
是可能还是我需要将对象复制(或使用指针以避免复制)到新列表中并返回该列表?
请注意,迭代器子集仅用于读取。 (一对const_iterator会完成这项工作)
谢谢! 贾科莫
答案 0 :(得分:4)
如果您不介意使用Boost,可以使用filter_iterator,例如
struct ShouldIncludeChecker
{
bool operator()(const Object& obj) const
{
return obj == object1 || obj == object3 || obj == object4;
// ^ Customize this to fit your need.
}
};
typedef boost::filter_iterator<ShouldIncludeChecker, std::list<Object>::iterator>
filter_iterator;
ShouldIncludeChecker checker;
std::list<Object>::iterator old_begin = the_list.begin();
std::list<Object>::iterator old_end = the_list.end();
filter_iterator new_begin (checker, old_begin, old_end);
filter_iterator new_end (checker, old_end, old_end);
for (filter_iterator it = new_begin; it != new_end; ++ it)
{
// read *it
}
此外,如果您正在阅读的内容可以成为输出迭代器,则可以使用std::remove_copy_if
。