Вернуть диапазон итератора (подмножество основного списка) - PullRequest
1 голос
/ 21 февраля 2012

Я хотел бы закодировать метод, способный возвращать диапазон итераторов для представления подмножества большего списка.

Может ли такое "подмножество" не создаваться из смежных объектов?

Например, если у меня есть std :: list с n объектами.

например.

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

Могу ли я вернуть диапазон итераторов (пару начала / конца мы можем вызватьItBegin и ItEnd), который будет включать только объекты 1,3 и 4?

например.

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

Возможно ли это, или мне нужно скопировать объекты (или использовать указатели, чтобы избежатьскопировать) в новый список и вернуть этот список?

Обратите внимание, что поднабор итераторов будет использоваться только для чтения.(пара const_iterator сделает эту работу)

Спасибо!Джакомо

1 Ответ

4 голосов
/ 21 февраля 2012

Если вы не против использовать 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.

...