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

Class iterator_range

Boost , Chapter 1. Range 2.0 , Utilities

Boost C++ LibrariesHomeLibrariesPeopleFAQMore

PrevUpHomeNext

Намерение класса iterator_range состоит в том, чтобы инкапсулировать два итератора, чтобы они выполняли концепцию Forward Range. Для удобства также предусмотрены некоторые другие функции.

Если аргумент шаблона не является моделью Forward Traversal Iterator, можно использовать подмножество интерфейса. В частности, size() требует итераторов случайного доступа, тогда как empty() требует только итераторов с одним проходом.

Напомним, что многие построенные по умолчанию итераторы являются singular и, следовательно, могут быть только назначены, но не сопоставлены или увеличены или что-либо еще. Однако, если вы создаете построенный по умолчанию iterator_range, вы все равно можете назвать все его функции-члены. Это дизайнерское решение позволяет избежать ограничения диапазона итераторов iterator_range, которые не являются уникальными. Любое ограничение сингулярности просто распространяется от основного типа итератора.

Synopsis

Базовая функциональность находится в файле заголовка </iterator_range_core.hpp> включает в себя всю функциональность, за исключением поддержки boost::hash_value и std::iostream.

The std::iostream support is in the header <boost/range/iterator_core.hpp> while the boost::hash_value support is in <boost/range/iterator_range_hash.hpp>

namespace boost
{
    template< class ForwardTraversalIterator >
    class iterator_range
    {
    public: // Forward Range types
        typedef ForwardTraversalIterator   iterator;
        typedef ForwardTraversalIterator   const_iterator;
        typedef iterator_difference<iterator>::type difference_type;
    public: // construction, assignment
        template< class ForwardTraversalIterator2 >
        iterator_range( ForwardTraversalIterator2 Begin, ForwardTraversalIterator2 End );
        template< class ForwardRange >
        iterator_range( ForwardRange& r );
        template< class ForwardRange >
        iterator_range( const ForwardRange& r );
        template< class ForwardRange >
        iterator_range& operator=( ForwardRange& r );
        template< class ForwardRange >
        iterator_range& operator=( const ForwardRange& r );
    public: // Forward Range functions
        iterator  begin() const;
        iterator  end() const;
    public: // convenience
        operator    unspecified_bool_type() const;
        bool        equal( const iterator_range& ) const;
        value_type& front() const;
        void        drop_front();
        void        drop_front(difference_type n);
        bool      empty() const;
        iterator_range& advance_begin(difference_type n);
        iterator_range& advance_end(difference_type n);
        // for Bidirectional:
        value_type& back() const;
        void drop_back();
        void drop_back(difference_type n);
        // for Random Access only:
        reference operator[]( difference_type at ) const;
        value_type operator()( difference_type at ) const;
        size_type size() const;
    };
    // stream output
    template< class ForwardTraversalIterator, class T, class Traits >
    std::basic_ostream<T,Traits>&
    operator<<( std::basic_ostream<T,Traits>& Os,
                const iterator_range<ForwardTraversalIterator>& r );
    // comparison
    template< class ForwardTraversalIterator, class ForwardTraversalIterator2 >
    bool operator==( const iterator_range<ForwardTraversalIterator>& l,
                     const iterator_range<ForwardTraversalIterator2>& r );
    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator==( const iterator_range<ForwardTraversalIterator>& l,
                     const ForwardRange& r );
    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator==( const ForwardRange& l,
                     const iterator_range<ForwardTraversalIterator>& r );
    template< class ForwardTraversalIterator, class ForwardTraversalIterator2 >
    bool operator!=( const iterator_range<ForwardTraversalIterator>& l,
                     const iterator_range<ForwardTraversalIterator2>& r );
    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator!=( const iterator_range<ForwardTraversalIterator>& l,
                     const ForwardRange& r );
    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator!=( const ForwardRange& l,
                     const iterator_range<ForwardTraversalIterator>& r );
    template< class ForwardTraversalIterator, class ForwardTraversalIterator2 >
    bool operator<( const iterator_range<ForwardTraversalIterator>& l,
                    const iterator_range<ForwardTraversalIterator2>& r );
    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator<( const iterator_range<ForwardTraversalIterator>& l,
                    const ForwardRange& r );
    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator<( const ForwardRange& l,
                    const iterator_range<ForwardTraversalIterator>& r );
    // external construction
    template< class ForwardTraversalIterator >
    iterator_range< ForwardTraversalIterator >
    make_iterator_range( ForwardTraversalIterator Begin,
                         ForwardTraversalIterator End );
    // Make an iterator_range [first, boost::next(first, n) )
    template< class ForwardTraversalIterator, class Integer >
    iterator_range< ForwardTraversalIterator >
    make_iterator_range_n( ForwardTraversalIterator first, Integer n );
    template< class ForwardRange >
    iterator_range< typename range_iterator<ForwardRange>::type >
    make_iterator_range( ForwardRange& r );
    template< class ForwardRange >
    iterator_range< typename range_iterator<const ForwardRange>::type >
    make_iterator_range( const ForwardRange& r );
    template< class Range >
    iterator_range< typename range_iterator<Range>::type >
    make_iterator_range( Range& r,
                         typename range_difference<Range>::type advance_begin,
                         typename range_difference<Range>::type advance_end );
    template< class Range >
    iterator_range< typename range_iterator<const Range>::type >
    make_iterator_range( const Range& r,
                         typename range_difference<const Range>::type advance_begin,
                         typename range_difference<const Range>::type advance_end );
    // convenience
    template< class Sequence, class ForwardRange >
    Sequence copy_range( const ForwardRange& r );
} // namespace 'boost'

Если экземпляр iterator_range построен клиентом с двумя итераторами, клиент должен убедиться, что два итератора разграничивают действительный закрытый диапазон [начало, конец].

Стоит отметить, что шаблонные конструкторы и операторы присваивания позволяют конвертировать из iterator_range<iterator> в iterator_range<const_iterator>. Точно так же, поскольку операторы сравнения имеют два аргумента шаблона, мы можем сравнивать диапазоны, когда итераторы сопоставимы; например, когда мы имеем дело с итераторами из одного контейнера.

Details member functions

operator unspecified_bool_type() const;

bool equal( iterator_range& r ) const;

Details functions

bool operator==( const ForwardRange1& l, const ForwardRange2& r );

Возвращает!r?ложный: равное(l),endl,начинает();начинает;5>;5>

bool operator!=( const ForwardRange1& l, const ForwardRange2& r );

bool operator<( const ForwardRange1& l, const ForwardRange2& r );

iterator_range make_iterator_range( Range& r,
                                    typename range_difference<Range>::type advance_begin,
                                    typename range_difference<Range>::type advance_end );

iterator new_begin = begin( r ),
iterator new_end   = end( r );
std::advance( new_begin, advance_begin );
std::advance( new_end, advance_end );
return make_iterator_range( new_begin, new_end );

Sequence copy_range( const ForwardRange& r );

ВозвратСеквенция(начало(r),конец(r);


PrevUpHomeNext

Статья Class iterator_range раздела Chapter 1. Range 2.0 Utilities может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 01:45:07/0.0068068504333496/1