Шаг 287.
Библиотека STL. Алгоритмы STL. Модифицирующие алгоритмы. Присваивание. Заполнение интервала повторяющимся значением

    На этом шаге мы рассмотрим заполнение интервалов повторяющимся значением.

    Следующие алгоритмы можно использовать для выполнения этой операции:

  void
  fill (ForwardIterator beg, ForwardIterator end, 
        const T& newValue)
  void
  fill_n (OutputIterator beg, Size num, 
          const T& newValue)

    Алгоритм fill() присваивает значение newValue каждому элементу в интервале [beg,end).

    Алгоритм fill_n() присваивает значение newValue первым num элементам в интервале, начинающемся с beg.

    Перед вызовом необходимо убедиться в том, что приемный интервал имеет достаточный размер, или использовать итераторы вставки.

    Сложность линейная (numberOfElements или num присваиваний соответственно).

    Пример использования алгоритмов fill() и fill_n().

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iterator>
#include "algostuff.hpp"

#include <conio.h> //необходимо для getch()

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}


int main()
{
  // Вывод десяти экземпляров 7.7
  cout << ToRus("Вывод десяти экземпляров 7.7:\n");
  fill_n(ostream_iterator<float>(cout, " "), // Начало приемника
         10,                                 // Счетчик
         7.7);                               // Новое значение
  cout << endl;

  list<string> coll;

  // Вставка девяти экземпляров "привет"
  fill_n(back_inserter(coll),       // Начало приемника
         9,                         // Счетчик
         ToRus("привет"));                  // Новое значение
  PRINT_ELEMENTS(coll,"Коллекция:\n");

  // Замена всех элементов строкой "снова"
  fill(coll.begin(), coll.end(),    // Приемник
       ToRus("снова"));             // Новое значение
  PRINT_ELEMENTS(coll,"Коллекция после замены:\n");

  // Замена всех элементов, кроме двух, строкой "хи"
  fill_n(coll.begin(),              // Начало приемника
         coll.size()-2,             // Счетчик
         ToRus("хи"));              // Новое значение
  PRINT_ELEMENTS(coll,"Коллекция после второй замены:\n");

  // Замена элементов от второго до предпоследнего строкой "хм"
  list<string>::iterator pos1, pos2;
  pos1 = coll.begin();
  pos2 = coll.end();
  fill (++pos1, --pos2,              // Приемник
        ToRus("хм"));                // Новое значение
  PRINT_ELEMENTS(coll,"Коллекция после третьей замены:\n");


  getch();
  return 0;
}

//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    При первом вызове алгоритм fill_n() используется для вывода определенного числа значений. Остальные вызовы fill() и fill_n() вставляют и заменяют значения в списке строк. Результат выполнения программы выглядит так:


Рис.1. Результат работы приложения

    На следующем шаге мы рассмотрим присваивание сгенерированных значений.




Предыдущий шаг Содержание Следующий шаг