Д. Стефенс - C++. Сборник рецептов

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Д. Стефенс - C++. Сборник рецептов краткое содержание

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

template

Value_T computeMean(Iter_T first, Iter_T last) {

if (first == last) throw domain_error("mean is undefined");

Value_T sum;

int cnt = 0;

while (first != last) {

sum += *first++;

++cnt;

}

return sum / cnt;

)

int main() {

cout << "please type in several integers separated by newlines" << endl;

cout << "and terminated by an EOF character (i.e , Ctrl-Z)" << endl;

double mean = computeMean(

istream_iterator(cin), istream_iterator());

cout << "the mean is " << mean << endl;

}

При написании обобщенного программного кода следует, по мере возможности, пытаться пользоваться наиболее общим типом итератора. Это подразумевает, что, когда возможно, вы должны стараться писать обобщенные алгоритмы с единственным проходом по потоку ввода. При таком подходе ваш обобщенный программный код не ограничивается только контейнерами, а может также использоваться с такими итераторами ввода, как istream_iterator. Кроме того, алгоритмы с единственным проходом часто более эффективны.

Возможно, вас удивляет то, что я решил тип, возвращаемый функцией computeMeanиз примера 11.7, передать в качестве параметра шаблона, а не выводить его из типа итератора. Это сделано по той причине, что обычно статистические расчеты выполняются с более высокой точностью, чем точность значений, содержащихся в контейнере. Так, в программном коде примера 11.7 возвращаемое среднее значение набора чисел целого типа имеет тип double.

11.4. Фильтрация значений, выпадающих из заданного диапазона

Проблема

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

Решение

Используйте функцию remove_copy_if, определенную в , как показано в примере 11.8.

Пример 11.8 Удаление из последовательности элементов, значения которых меньше заданного

#include

#include

#include

#include

using namespace std;

struct OutOfRange {

OutOfRange(int min, int max) :

min_(min), max_(max) {}

bool operator()(int x) {

return (x < min_) || (x > max_);

}

int min_;

int max_;

};

int main() {

vector v;

v.push_back(6);

v.push_back(12);

v.push_back(10);

v.push_back(24);

v.push_back(30);

remove_copy_if(v.begin(), v.end(),

ostream_iterator(cout, "\n"), OutOfRange(10, 25));

}

Программа примера 11.8 выдает следующий результат.

12

18

24

Обсуждение

Функция remove_copy_ifкопирует элементы из одного контейнера в другой контейнер (или итератор вывода), игнорируя те элементы, которые удовлетворяют предоставленному вами предикату (вероятно, было бы более правильно назвать функцию copy_ignore_if). Однако эта функция не изменяет размер целевого контейнера. Если (как часто бывает) количество скопированных функцией remove_copy_ifэлементов меньше, чем размер целевого контейнера, вам придется уменьшить целевой контейнер с помощью функции-члена erase.

Для функции remove_copy_ifтребуется унарный предикат (функтор, который принимает один аргумент и возвращает значение типа boolean), который возвращает значение «истина», когда элемент не должен копироваться. В примере 11.8 предикатом является объект-функция OutOfRange. Конструктор OutOfRangeпринимает нижнюю и верхнюю границу и перегружает оператор operator(). Функция operator()принимает параметр целого типа и возвращает значение «истина», если переданный аргумент меньше, чем нижняя граница, или больше, чем верхняя граница.

11.5. Вычисление дисперсии, стандартного отклонения и других статистических функций

Проблема

Требуется рассчитать значение одной или нескольких обычных статистических функций, например дисперсии (variance), стандартного отклонения (standard deviation), коэффициента асимметрии (skew) и эксцесса (kurtosis) для последовательности чисел.

Решение

Функцию accumulateиз заголовочного файла можно использовать для расчета многих статистических параметров, а не только для суммирования пользовательских объектов-функций. Пример 11.9 показывает, как можно вычислить значения некоторых важных статистические функций при помощи accumulate.

Пример 11.9. Статистические функции

#include

#include

#include

#include

#include

#include

using namespace std;

template

T nthPnwer(T x) {

T ret = x;

for (int i=1; i < N; ++i) {

ret *= x;

}

return ret;

}

template

struct SumDiffNthPower {

SumDiffNthPower(T x) : mean_(x) {};

T operator()(T sum, T current) {

return sum + nthPower(current - mean_);

}

T mean_;

};

template

T nthMoment(Iter_T first, Iter_T last, T mean) {

size_t cnt = distance(first, last);

return accumulate(first, last, T(), SumDiffNthPower(mean)) / cnt;

}

template

T computeVariance(Iter_T first, Iter_T last, T mean) {

return nthMoment(first, last, mean);

}

template

T computeStdDev(Iter_T first, Iter_T last, T mean) {

return sqrt(computeVariance(first, last, mean));

}

template

T computeSkew(Iter_T begin, Iter_T end, T mean) {

T m3 = nthMoment(begin, end, mean);

T m2 = nthMoment(begin, end, mean);

return m3 / (m2 * sqrt(m2));

}

template

T computeKurtosisExcess(Iter_T begin, Iter_T end, T mean) {

T m4 = nthMoment(begin, end, mean);

T m2 = nthMoment(begin, end, mean);

return m4 / (m2 * m2) - 3;

}

template

void computeStats(Iter_T first, Iter_T last, T& sum, T& mean,

T& var, T& std_dev, T& skew, T& kurt) {

size_t cnt = distance(first, last);

sum = accumulate(first, last, T());

mean = sum / cnt;

var = computeVariance(first, last, mean);

std_dev = sort(var);

skew = computeSkew(first, last, mean);

kurt = computeKurtosisExcess(first, last, mean);

}

int main() {

vector v;

v.push_back(2);

v.push_back(4);

v.push_back(8);

v.push_back(10);

v.push_back(99);

v.push_back(1);

double sum, mean, var, dev, skew, kurt;

computeStats(v.begin(), v.end(), sum, mean, var, dev, skew, kurt);

cout << "count = " << v.size() << "\n";

cout << "sum = " << sum << "\n";

cout << "mean = " << mean << "\n";

cout << "variance = " << var << "\n";

cout << "standard deviation = " << dev << "\n";

cout << "skew = " << skew << "\n";

cout << "kurtosis excess = " << kurt << "\n";

cout << endl;

}

Программа примера 11.9 выдает следующий результат

count = 6

sum = 124

mean = 20.6667

variance = 1237.22

standard deviation = 35.1742

skew = 1.75664

kurtosis excess = 1.14171

Обсуждение

Некоторые наиболее важные статистические функции (например, дисперсия, стандартное отклонение, коэффициент асимметрии и эксцесс) определяются исходя из нормализованных выборочных моментов. Статистические функции определяются немного по-разному в различных текстах. Здесь мы используем несмещенные определения статистических функций, которые сведены в табл. 11.1.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C++. Сборник рецептов отзывы


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x