【问题标题】:Return an iterator range (subset of a main list)返回一个迭代器范围(主列表的子集)
【发布时间】:2012-03-11 19:37:36
【问题描述】:

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

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

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

例如。

| object1 | object2 | object3 | object4 | ... | objectn

我能否返回仅包含对象 1,3 和 4 的迭代器范围(一对开始/结束,我们可以称为 ItBegin 和 ItEnd)?

例如。

| object1 | object2 | object3 | object4 | ... | objectN
     ^                   ^         ^                      ^
     |                   |         |                      |
   ItBegin           ++ItBegin ++ItBegin                ItEnd

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

请注意,迭代器子集仅用于读取。 (一对 const_iterator 就可以完成这项工作)

谢谢! 贾科莫

【问题讨论】:

  • 迭代器按照特定的迭代顺序进行迭代。因此,您可以 1)编写自定义迭代器,使用特定的“子集”选择算法迭代同一集合,或 2)创建仅包含您需要的元素的“子集”集合。
  • 如果你有一个随机访问的容器,而不是std::list,你的方法可以返回一个索引向量,例如。另一种选择是对容器进行排序,以便连续存储您需要的元素。
  • 添加我自己的评论,如果您担心内存消耗,请记住您的子集集合可能只包含对象引用,而不包含对象副本!

标签: c++ pointers reference iterator std


【解决方案1】:

如果您不介意使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2010-09-23
    • 2018-04-08
    • 2015-09-23
    • 2014-02-16
    相关资源
    最近更新 更多