返回迭代器范围(主列表的子集)

时间:2012-02-21 13:31:14

标签: c++ pointers reference iterator std

我想编写一个能够返回一系列迭代器的方法,以表示更大列表的子集。

这样的“子集”不能由连续的对象组成吗?

例如,如果我有一个带有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会完成这项工作)

谢谢! 贾科莫

1 个答案:

答案 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