Поделиться через


Класс front_insert_iterator

Описывает адаптер итератора, удовлетворяющий требованиям итератора вывода. Он вставляет элементы, а не перезаписывает элементы в передней части последовательности. Таким образом, он предоставляет семантику, отличную от семантики перезаписи, предоставляемой итераторами контейнеров последовательности C++. Класс front_insert_iterator шаблонизируется в типе контейнера.

Синтаксис

template <class Container>
class front_insert_iterator;

Параметры

Контейнер
Тип контейнера, в переднюю часть которого итератор front_insert_iterator вставит элементы.

Замечания

Контейнер должен удовлетворять требованиям последовательности вставки в переднюю часть, если можно вставить элементы в начало последовательности в постоянном времени с поправкой на амортизацию. Контейнеры последовательности стандартной библиотеки C++, определенные классами deque и list, обеспечивают необходимую функцию-член push_front и удовлетворяют этим требованиям. В отличие от этого, контейнеры последовательностей, определенные классом векторов, не соответствуют этим требованиям и не могут быть адаптированы для использования с sfront_insert_iterator. Итератор front_insert_iterator всегда необходимо инициализировать с его контейнером.

Конструкторы

Конструктор Description
front_insert_iterator Создает итератор, может вставлять элементы с передней стороны указанного объекта контейнера.

Определения типов

Введите имя Description
container_type Тип, представляющий контейнер, в переднюю часть которого будет осуществляться вставка.
reference Тип, который предоставляет ссылку на элемент последовательности под управлением связанного контейнера.

Операторы

Operator Description
operator* Оператор удаления ссылки, используемый для применения выражения итератора вывода * i = x для вставки в переднюю часть.
оператор++ Увеличивает front_insert_iterator до следующего местоположения, в котором можно сохранить значение.
operator= Оператор присваивания, используемый для применения выражения итератора вывода * i = x для вставки в переднюю часть.

Требования

Заголовок: <итератор>

Пространство имен: std

front_insert_iterator::container_type

Тип, представляющий контейнер, в переднюю часть которого будет осуществляться вставка.

typedef Container container_type;

Замечания

Этот тип является синонимом для параметра-шаблона Container.

Пример

// front_insert_iterator_container_type.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>

int main( )
{
   using namespace std;

   list<int> L1;
   front_insert_iterator<list<int> >::container_type L2 = L1;
   front_inserter ( L2 ) = 20;
   front_inserter ( L2 ) = 10;
   front_inserter ( L2 ) = 40;

   list <int>::iterator vIter;
   cout << "The list L2 is: ( ";
   for ( vIter = L2.begin ( ) ; vIter != L2.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;
}
/* Output:
The list L2 is: ( 40 10 20 ).
*/

front_insert_iterator::front_insert_iterator

Создает итератор, может вставлять элементы с передней стороны указанного объекта контейнера.

explicit front_insert_iterator(Container& _Cont);

Параметры

_Продолжение
Объект контейнера, в который front_insert_iterator вставляет элементы.

Возвращаемое значение

front_insert_iterator для объекта контейнера параметра.

Пример

// front_insert_iterator_front_insert_iterator.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>

int main( )
{
   using namespace std;
   int i;
   list <int>::iterator L_Iter;

   list<int> L;
   for (i = -1 ; i < 9 ; ++i )
   {
      L.push_back ( 2 * i );
   }

   cout << "The list L is:\n ( ";
   for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++)
      cout << *L_Iter << " ";
   cout << ")." << endl;

   // Using the member function to insert an element
   front_inserter ( L ) = 20;

   // Alternatively, one may use the template function
   front_insert_iterator< list < int> > Iter(L);
*Iter = 30;

   cout << "After the front insertions, the list L is:\n ( ";
   for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++)
      cout << *L_Iter << " ";
   cout << ")." << endl;
}
/* Output:
The list L is:
( -2 0 2 4 6 8 10 12 14 16 ).
After the front insertions, the list L is:
( 30 20 -2 0 2 4 6 8 10 12 14 16 ).
*/

front_insert_iterator::operator*

Разыменовывает итератор вставки и возвращает адресованный элемент.

front_insert_iterator<Container>& operator*();

Возвращаемое значение

Функция-член возвращает значение адресованного элемента.

Замечания

Используется для реализации выражения итератора выходных данных *Iter. = Если Iter это итератор, который обращается к элементу в последовательности, то *Iter = заменяет этот элемент значением и не изменяет общее количество элементов в последовательности.

Пример

// front_insert_iterator_deref.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>

int main( )
{
   using namespace std;
   int i;
   list <int>::iterator L_Iter;

   list<int> L;
   for ( i = -1 ; i < 9 ; ++i )
   {
      L.push_back ( 2 * i );
   }

   cout << "The list L is:\n ( ";
   for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++)
      cout << *L_Iter << " ";
   cout << ")." << endl;

   front_insert_iterator< list < int> > Iter(L);
*Iter = 20;

   // Alternatively, you may use
   front_inserter ( L ) = 30;

   cout << "After the front insertions, the list L is:\n ( ";
   for ( L_Iter = L.begin( ) ; L_Iter != L.end( ); L_Iter++)
      cout << *L_Iter << " ";
   cout << ")." << endl;
}
/* Output:
The list L is:
( -2 0 2 4 6 8 10 12 14 16 ).
After the front insertions, the list L is:
( 30 20 -2 0 2 4 6 8 10 12 14 16 ).
*/

front_insert_iterator::operator++

Увеличивает back_insert_iterator до следующего местоположения, в котором можно сохранить значение.

front_insert_iterator<Container>& operator++();

front_insert_iterator<Container> operator++(int);

Возвращаемое значение

front_insert_iterator, адресующий следующее местоположение, в котором можно сохранить значение.

Замечания

Операторы preincrementation и postincrementation возвращают одинаковый результат.

Пример

// front_insert_iterator_op_incre.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>

int main( )
{
   using namespace std;

   list<int> L1;
   front_insert_iterator<list<int> > iter ( L1 );
*iter = 10;
   iter++;
*iter = 20;
   iter++;
*iter = 30;
   iter++;

   list <int>::iterator vIter;
   cout << "The list L1 is: ( ";
   for ( vIter = L1.begin ( ) ; vIter != L1.end ( ); vIter++ )
      cout << *vIter << " ";
   cout << ")." << endl;
}
/* Output:
The list L1 is: ( 30 20 10 ).
*/

front_insert_iterator::operator=

Добавляет (заносит) значение в переднюю часть контейнера.

front_insert_iterator<Container>& operator=(typename Container::const_reference val);

front_insert_iterator<Container>& operator=(typename Container::value_type&& val);

Параметры

Val
Значение, которое должно быть присвоено контейнеру.

Возвращаемое значение

Ссылка на последний элемент, вставленный в начале контейнера.

Замечания

Первый оператор-член вычисляет container.push_front( val), затем возвращает *this.

Второй оператор-член вычисляет

container->push_front((typename Container::value_type&&) val),

затем возвращает *this.

Пример

// front_insert_iterator_op_assign.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>

int main( )
{
   using namespace std;

   list<int> L1;
   front_insert_iterator<list<int> > iter ( L1 );
*iter = 10;
   iter++;
*iter = 20;
   iter++;
*iter = 30;
   iter++;

   list <int>::iterator vIter;
   cout << "The list L1 is: ( ";
   for ( vIter = L1.begin ( ) ; vIter != L1.end ( ); vIter++ )
      cout << *vIter << " ";
   cout << ")." << endl;
}
/* Output:
The list L1 is: ( 30 20 10 ).
*/

front_insert_iterator::reference

Тип, который предоставляет ссылку на элемент последовательности под управлением связанного контейнера.

typedef typename Container::reference reference;

Пример

// front_insert_iterator_reference.cpp
// compile with: /EHsc
#include <iterator>
#include <list>
#include <iostream>

int main( )
{
   using namespace std;

   list<int> L;
   front_insert_iterator<list<int> > fiivIter( L );
*fiivIter = 10;
*fiivIter = 20;
*fiivIter = 30;

   list<int>::iterator LIter;
   cout << "The list L is: ( ";
   for ( LIter = L.begin ( ) ; LIter != L.end ( ); LIter++)
      cout << *LIter << " ";
   cout << ")." << endl;

   front_insert_iterator<list<int> >::reference
        RefFirst = *(L.begin ( ));
   cout << "The first element in the list L is: "
        << RefFirst << "." << endl;
}
/* Output:
The list L is: ( 30 20 10 ).
The first element in the list L is: 30.
*/

См. также

<iterator>
Потокобезопасность в стандартной библиотеке C++
Справочник по стандартной библиотеке C++