На этом шаге мы рассмотрим заполнение интервалов повторяющимся значением.
Следующие алгоритмы можно использовать для выполнения этой операции:
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. Результат работы приложения
На следующем шаге мы рассмотрим присваивание сгенерированных значений.