Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Filter Iterator

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Filter Iterator

Author: Дэвид Абрахамс, Джереми Сик, Томас Витт
Contact: Если Итератор Считываемый Lvalue Iterator и Bidirectional Traversal Iterator затем iterator_category конвертируется в std::bidirectional_iterator_tag. В противном случае, если Итератор Считываемый Lvalue Iterator и Forward Traversal Iterator затем iterator_category конвертируется в std::forward_iterator_tag. В противном случае iterator_category конвертируется в std::input_iterator_tag.

filter_iterator requirements

Аргумент Iterator должен соответствовать требованиям Readable Iterator и Single Pass Iterator или соответствовать требованиям Input Iterator.

Аргумент Predicate должен быть приемлемым, конструктивным для копирования, а выражение p(x) должно быть действительным, если p является объектом типа x является объектом типа iterator_traits::value_type, и если тип p(x) должен быть конвертируемым в bool.

filter_iterator models

Концепции, которые модели filter_iterator, зависят от того, какие концепции модели аргументов Iterator, как указано в следующих таблицах.

If Iterator models then filter_iterator models
Итератор Single Pass Итератор Single Pass
Вперед Traversal Iterator Вперед Traversal Iterator
Двунаправленный итератор поворотов Двунаправленный итератор поворотов
If Iterator models then filter_iterator models
Читаемый итератор Читаемый итератор
Письменный итератор Письменный итератор
Lvalue итератор Lvalue итератор
If Iterator models then filter_iterator models
Считываемый итератор, Single Pass Iterator Итератор ввода
Читаемый итератор Lvalue, передний итератор Traversal Передний итератор
Lvalue Iterator, Forward Traversal Iterator Мутабельный передний итератор
Переписываемый итератор Lvalue, двунаправленный итератор Мутабельный двунаправленный итератор

filter_iterator X> совместим с filter_iterator Y>, если и только если X совместим с Y.

filter_iterator operations

В дополнение к тем операциям, которые требуются для моделей filter_iterator, filter_iterator обеспечивает следующие операции.

filter_iterator();

Requires:Predicate and Iterator must be Default Constructible.
Effects:Constructs a filter_iterator whose``m_pred``, m_iter, and m_end members are a default constructed.

filter_iterator(Предсказатель f, Итератор x, Итератор end = Итератор());<17

Effects:Constructs a filter_iterator where m_iter is either the first position in the range [x,end) such that f(*m_iter) == true or else``m_iter == end``. The member m_pred is constructed from f and m_end from end.

filter_iterator(Iterator x, Iterator end = Iterator());

Requires:Predicate must be Default Constructible and Predicate is a class type (not a function pointer).
Effects:Constructs a filter_iterator where m_iter is either the first position in the range [x,end) such that m_pred(*m_iter) == true or else``m_iter == end``. The member m_pred is default constructed.
template <class OtherIterator>
filter_iterator(
    filter_iterator<Predicate, OtherIterator> const& t
    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
    );``
Requires:OtherIterator is implicitly convertible to Iterator.
Effects:Constructs a filter iterator whose members are copied from t.

Предсказание Предикат() конст;

Returns:m_pred

Итератор конец() конст;

Returns:m_end

Итератор const& base() const;

Returns:m_iterator

ссылка оператор*() конст;

Returns:*m_iter

filter_iterator& operator++();

Effects:Increments m_iter and then continues to increment m_iter until either m_iter == m_end or m_pred(*m_iter) == true.
Returns:*this
template <class Predicate, class Iterator>
filter_iterator<Predicate,Iterator>
make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
Returns:filter_iterator<Predicate,Iterator>(f, x, end)
template <class Predicate, class Iterator>
filter_iterator<Predicate,Iterator>
make_filter_iterator(Iterator x, Iterator end = Iterator());
Returns:filter_iterator<Predicate,Iterator>(x, end)

Example

В этом примере используется filter_iterator, а затем make_filter_iterator для вывода только положительных целых чисел из массива целых чисел. Затем make_filter_iterator используется для вывода целых чисел, превышающих -2.

struct is_positive_number {
  bool operator()(int x) { return 0 < x; }
};
int main()
{
  int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 };
  const int N = sizeof(numbers_)/sizeof(int);
  typedef int* base_iterator;
  base_iterator numbers(numbers_);
  // Example using filter_iterator
  typedef boost::filter_iterator<is_positive_number, base_iterator>
    FilterIter;
  is_positive_number predicate;
  FilterIter filter_iter_first(predicate, numbers, numbers + N);
  FilterIter filter_iter_last(predicate, numbers + N, numbers + N);
  std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
  // Example using make_filter_iterator()
  std::copy(boost::make_filter_iterator<is_positive_number>(numbers, numbers + N),
            boost::make_filter_iterator<is_positive_number>(numbers + N, numbers + N),
            std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
  // Another example using make_filter_iterator()
  std::copy(
      boost::make_filter_iterator(
          std::bind2nd(std::greater<int>(), -2)
        , numbers, numbers + N)
    , boost::make_filter_iterator(
          std::bind2nd(std::greater<int>(), -2)
        , numbers + N, numbers + N)
    , std::ostream_iterator<int>(std::cout, " ")
  );
  std::cout << std::endl;
  return boost::exit_success;
}

Результатом является:

4 5 8
4 5 8
0 -1 4 5 8

Исходный код для этого примера можно найти здесь .

Статья Filter Iterator раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:09:26/0.0040128231048584/0