зависящих от выбранного алгоритма. В примере 11.12 я использую генератор Mersenne Twister (mt19937
), потому что он дает хорошее сочетание производительности и качества последовательности случайных чисел.
11.7. Инициализация контейнера случайными числами
Требуется заполнить произвольный контейнер случайными числами.
Можно использовать функции generate
и generate_n
из заголовочного файла <algorithm>
совместно с функтором, возвращающим случайные числа. Пример 11.13 показывает, как это можно сделать.
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>
#include <cstdlib>
using namespace std;
struct RndIntGen {
RndIntGen(int l, int h) : low(l), high(h) {}
int operator()() const {
return low + (rand() % ((high - low) + 1));
}
private:
int low;
int high;
};
int main() {
srand(static_cast<unsigned int>(clock()));
vector<mt> v(5);
generate(v.begin(), v.end(), RndIntGen(1, 6));
copy(v.begin(), v.end(), ostream_iterator<int>(cout, '
'));
}
Программа примера 11.13 должна выдать результат, подобный следующему.
3
1
2
6
4
Стандартная библиотека C++ содержит функции generate
и generate_n
, специально предназначенные для заполнения контейнеров значениями, полученными функцией генератора случайных чисел. Эти функции принимают нуль-арный функтор (указатель на функцию или объект-функцию без аргументов), результат которого присваивается соседним элементам контейнера. Пример реализации функции generate
и generate_n
показан в примере 11.14.
template<class Iter_T, class Fxn_T>
void generate(Iter_T first, Iter_T last, Fxn_T f) {
while (first != last) *first++ = f();
}
template<class Iter_T, class Fxn_T>
void generate_n(Iter_T first, int n, Fxn_T f) {
for (int i=0; i < n; ++i) *first++ = f();
}
11.8. Представление динамического числового вектора
Требуется иметь тип для манипулирования динамическими числовыми векторами.
Вы можете использовать шаблон valarray
из заголовочного файла <valarray>
. Пример 11.15 показывает, как можно использовать шаблон valarray
.
#include <valarray>
#include <iostream>
using namespace std;
int main() {
valarray<int> v(3);
v[0] = 1;
v[1] = 2;
v[2] = 3;
cout << v[0] << ', ' << v[1] << ', ' << v[2] << endl;
v = v + v;
cout << v[0] << ', ' << v[1] << ', ' << v[2] << endl;
v /= 2;
cout << v[0] << ', ' << v[1] << ', ' << v[2] << endl;
}
Программа примера 11.15 выдаст следующий результат.
1, 2, 3
2, 4, 6
1, 2, 3
Вопреки своему названию тип vector
не предназначен для использования в качестве числового вектора, для этой цели используется шаблон valarray
. Этот шаблон написан так, чтобы в конкретных реализациях С++, особенно на высокопроизводительных машинах, можно было применить к нему специальную векторную оптимизацию. Другое большое преимущество