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

C++ 返回迭代器范围(主列表的子集),c++,pointers,reference,iterator,std,C++,Pointers,Reference,Iterator,Std,我想编写一个能够返回一系列迭代器以表示更大列表的子集的方法 这样的子集不能由连续对象组成吗 例如,如果我有一个包含n个对象的std::list 例如 我可以返回一系列迭代器吗?一对begin/end,我们可以称之为ItBegin和ItEnd,其中只包含对象1、3和4 例如 这是可能的,还是我需要复制对象或使用指针来避免复制到新列表并返回该列表 请注意迭代器子集仅用于读取。一对常量迭代器将完成这项工作 谢谢! Giacomo如果您不介意使用Boost,您可以使用,例如 此外,如果您正在阅读的内容可

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

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

例如,如果我有一个包含n个对象的std::list

例如

我可以返回一系列迭代器吗?一对begin/end,我们可以称之为ItBegin和ItEnd,其中只包含对象1、3和4

例如

这是可能的,还是我需要复制对象或使用指针来避免复制到新列表并返回该列表

请注意迭代器子集仅用于读取。一对常量迭代器将完成这项工作

谢谢!
Giacomo

如果您不介意使用Boost,您可以使用,例如


此外,如果您正在阅读的内容可以变成输出迭代器,您可以使用std::remove\u copy\u if。

如果您不介意使用Boost,您可以使用,例如


另外,如果您要读取的内容可以生成一个输出迭代器,那么您可以使用std::remove\u copy\u if.

迭代器按照特定的迭代顺序进行迭代。因此,您可以1编写使用特定子集选择算法迭代同一集合的自定义迭代器,或2创建仅包含所需元素的子集集合。例如,如果您使用的容器不是std::list,而是随机访问,则您的方法可以返回索引向量。另一个选项是对容器进行排序,以便连续存储所需的元素。要添加我自己的注释,如果担心内存消耗,请记住,子集集合可能只包含对象引用,而不包含对象副本!迭代器按照特定的迭代顺序进行迭代。因此,您可以1编写使用特定子集选择算法迭代同一集合的自定义迭代器,或2创建仅包含所需元素的子集集合。例如,如果您使用的容器不是std::list,而是随机访问,则您的方法可以返回索引向量。另一个选项是对容器进行排序,以便连续存储所需的元素。要添加我自己的注释,如果担心内存消耗,请记住,子集集合可能只包含对象引用,而不包含对象副本!
| object1 | object2 | object3 | object4 | ... | objectn
| object1 | object2 | object3 | object4 | ... | objectN
     ^                   ^         ^                      ^
     |                   |         |                      |
   ItBegin           ++ItBegin ++ItBegin                ItEnd
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
}