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


Класс back_insert_iterator

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

Синтаксис

template <class Container>
class back_insert_iterator;

Параметры

Контейнер
Тип контейнера, в конец которого итератор back_insert_iterator вставит элементы.

Замечания

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

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

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

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

Введите имя Description
container_type Тип, предоставляющий контейнер для итератора back_insert_iterator.
reference Тип, предоставляющий ссылку для итератора back_insert_iterator.

Операторы

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

Требования

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

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

back_insert_iterator::back_insert_iterator

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

explicit back_insert_iterator(Container& _Cont);

Параметры

_Продолжение
Контейнер, в который back_insert_iterator вставляет элемент.

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

back_insert_iterator для параметра Container.

Пример

// back_insert_iterator_back_insert_iterator.cpp
// compile with: /EHsc
#include <iterator>
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   int i;

   vector<int> vec;
   for ( i = 1 ; i < 4 ; ++i )
   {
      vec.push_back ( i );
   }

   vector <int>::iterator vIter;
   cout << "The initial vector vec is: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;

   // Insertions with member function
   back_inserter ( vec ) = 40;
   back_inserter ( vec ) = 50;

   // Alternatively, insertions can be done with template function
   back_insert_iterator<vector<int> > backiter ( vec );
*backiter = 600;
   backiter++;
*backiter = 700;

   cout << "After the insertions, the vector vec is: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;
}
The initial vector vec is: ( 1 2 3 ).
After the insertions, the vector vec is: ( 1 2 3 40 50 600 700 ).

back_insert_iterator::container_type

Тип, предоставляющий контейнер для итератора back_insert_iterator.

typedef Container
container_type;

Замечания

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

Пример

// back_insert_iterator_container_type.cpp
// compile with: /EHsc
#include <iterator>
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   int i;

   vector<int> vec;
   for (i = 1 ; i < 4 ; ++i )
   {
      vec.push_back (  i );
   }

   vector <int>::iterator vIter;
   cout << "The original vector vec is: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;

   back_insert_iterator<vector<int> >::container_type vec1 = vec;
   back_inserter ( vec1 ) = 40;

   cout << "After the insertion, the vector is: ( ";
   for ( vIter = vec1.begin ( ) ; vIter != vec1.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;
}
The original vector vec is: ( 1 2 3 ).
After the insertion, the vector is: ( 1 2 3 40 ).

back_insert_iterator::operator*

Оператор dereferencing, используемый для реализации выражения итератора выходных данных * i = x.

back_insert_iterator<Container>& operator*();

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

Ссылка на элемент, вставленный в конец контейнера.

Замечания

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

Пример

// back_insert_iterator_back_insert.cpp
// compile with: /EHsc
#include <iterator>
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   int i;

   vector<int> vec;
   for (i = 1 ; i < 4 ; ++i )
   {
      vec.push_back ( i );
   }

   vector <int>::iterator vIter;
   cout << "The vector vec is: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;

   back_insert_iterator<vector<int> > backiter ( vec );
*backiter = 10;
   backiter++;      // Increment to the next element
*backiter = 20;
   backiter++;

   cout << "After the insertions, the vector vec becomes: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;
}
The vector vec is: ( 1 2 3 ).
After the insertions, the vector vec becomes: ( 1 2 3 10 20 ).

back_insert_iterator::operator++

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

back_insert_iterator<Container>& operator++();
back_insert_iterator<Container> operator++(int);

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

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

Замечания

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

Пример

// back_insert_iterator_op_incre.cpp
// compile with: /EHsc
#include <iterator>
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   int i;

   vector<int> vec;
   for (i = 1 ; i < 3 ; ++i )
   {
      vec.push_back ( 10 * i );
   }

   vector <int>::iterator vIter;
   cout << "The vector vec is: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;

   back_insert_iterator<vector<int> > backiter ( vec );
*backiter = 30;
   backiter++;      // Increment to the next element
*backiter = 40;
   backiter++;

   cout << "After the insertions, the vector vec becomes: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;
}
The vector vec is: ( 10 20 ).
After the insertions, the vector vec becomes: ( 10 20 30 40 ).

back_insert_iterator::operator=

Добавляет или вставляет значение в конец контейнера.

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

Параметры

Val
Значение для вставки в контейнер.

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

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

Замечания

Первый оператор-член вычисляет Container.push_back( val),

затем возвращает *this. Второй оператор-член вычисляет

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

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

Пример

// back_insert_iterator_op_assign.cpp
// compile with: /EHsc
#include <iterator>
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   int i;

   vector<int> vec;
   for (i = 1 ; i < 4 ; ++i )
   {
      vec.push_back ( i );
   }

   vector <int>::iterator vIter;
   cout << "The vector vec is: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;

   back_insert_iterator<vector<int> > backiter ( vec );
*backiter = 10;
   backiter++;      // Increment to the next element
*backiter = 20;
   backiter++;

   cout << "After the insertions, the vector vec becomes: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;
}

back_insert_iterator::reference

Тип, предоставляющий ссылку для итератора back_insert_iterator.

typedef typename Container::reference reference;

Замечания

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

Пример

// back_insert_iterator_reference.cpp
// compile with: /EHsc
#include <iterator>
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   int i;

   vector<int> vec;
   for (i = 1 ; i < 4 ; ++i )
   {
      vec.push_back ( i );
   }

   vector <int>::iterator vIter;
   cout << "The vector vec is: ( ";
   for ( vIter = vec.begin ( ) ; vIter != vec.end ( ); vIter++)
      cout << *vIter << " ";
   cout << ")." << endl;

   back_insert_iterator<vector<int> >::reference
        RefLast = *(vec.end ( ) - 1 );
   cout << "The last element in the vector vec is: "
        << RefLast << "." << endl;
}
The vector vec is: ( 1 2 3 ).
The last element in the vector vec is: 3.

См. также

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