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


Авторские права

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

Здесь можно скачать бесплатно "Д. Стефенс - C++. Сборник рецептов" в формате fb2, epub, txt, doc, pdf. Жанр: Программирование, издательство КУДИЦ-ПРЕСС, год 2007. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Д. Стефенс - C++. Сборник рецептов
Рейтинг:
Название:
C++. Сборник рецептов
Автор:
Издательство:
КУДИЦ-ПРЕСС
Год:
2007
ISBN:
5-91136-030-6
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "C++. Сборник рецептов"

Описание и краткое содержание "C++. Сборник рецептов" читать бесплатно онлайн.



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






Пример 11.22. Расчет расстояния между двумя векторами

#include <cmath>

#include <iostream>


using namespace std;


template<class Iter_T, class Iter2_T>

double vectorDistance(Iter_T first, Iter_T last, Iter2_T first2) {

 double ret = 0.0;

 while (first != last) {

  double dist = (*first++) - (*first2++);

  ret += dist * dist;

 }

 return ret > 0.0 ? sqrt(ret) : 0.0;

}


int main() {

 int v1[] = { 1, 5 };

 int v2[] = { 4, 9 };

 cout << "distance between vectors (1,5) and (4,9) is ";

 cout << vectorDistance(v1, v1 + 2, v2) << endl;

}

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

distance between vectors (1,5) and (4,9) is 5

Обсуждение

Пример 11.22 реализует прямое решение, которое показывает, как следует писать простую обобщенную функцию в стиле STL. Для расчета расстояний между векторами я мог бы использовать функцию inner_product, однако я не стал использовать функтор, потому что это неоправданно усложнило бы решение. Пример 11.23 показывает, как можно рассчитывать расстояние между векторами, применяя функтор и функцию inner_product из заголовочного файла <numeric>.

Пример 11.23. Расчет расстояния между векторами с использованием функции inner_product

#include <numeric>

#include <cmath>

#include <iostream>

#include <functional>


using namespace std;


template<class Value_T>

struct DiffSquared {

 Value_T operator()(Value_T x, Value_T y) const {

  return (x - y) * (x - y);

 }

};


template<class Iter_T, class Iter2_T>

double vectorDistance(Iter_T first, Iter_T last, Iter2_T first2) {

 double ret = inner_product(first, last, first2, 0.0L,

  plus<double>(), DiffSquared<double>());

 return ret > 0.0 ? sqrt(ret) : 0.0;

}


int main() {

 int v1[] = { 1, 5 };

 int v2[] = { 4, 9 };

 cout << "distance between vectors (1,5) and (4,9) is ";

 cout << vectorDistance(v1, v1 + 2, v2) << endl;

}

Поскольку реализация функции inner_product() может быть специально оптимизирована для вашей платформы и вашего компилятора, я предпочитаю ее использовать везде, где это возможно.

11.13. Реализация итератора с шагом

Проблема

Имеются смежные числовые ряды и требуется обеспечить доступ к каждому n-му элементу.

Решение

В примере 11.24 представлен заголовочный файл, реализующий класс итератора с шагом.

Пример 11.24. stride_iter.hpp

#ifndef STRIDE_ITER_HPP

#define STRIDE_ITER_HPP


#include <iterator>

#include <cassert>


template<class Iter_T>

class stride_iter {

public:


 // открытые имена, вводимые typedef

 typedef typename std::iterator_traits<Iter_T>::value_type value_type;

 typedef typename std::iterator_traits<Iter_T>::reference reference;

 typedef typename std::iterator_traits<Iter_T>::difference_type

  difference_type;

 typedef typename std::iterator_traits<Iter_T>::pointer pointer;

 typedef std::random_access_iterator_tag iterator_category;

 typedef stride_iter self;


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

 stride_iter() : m(NULL), step(0) {};

 stride_iter(const self& x) : m(x.m), step(x.step) {}

 stride_iter(Iter_T x, difference_type n) : m(x), step(n) {}


 // операторы

 self& operator++() { m += step; return *this; }

 self operator++(int) { self tmp = *this; m += step; return tmp; }

 self& operator+=(difference_type x) { m += x * step; return *this; }

 self& operator--() { m -= step; return *this; }

 self operator--(int) { self tmp = *this; m -= step; return trap; }

 self& operator--(difference type x) { m -= x + step; return *this; }

 reference operator[](difference_type n) { return m[n * step]; }

 reference operator*() { return *m; }


 // дружественные операторы

 friend bool operator==(const self& x, const self& y) {

  assert(x.step == y.step);

  return x.m == y.m;

 }

 friend bool operator!=(const self& x, const self& y) {

  assert(x.step == y.step);

  return x.m != y.m;

 }

 friend bool operator<(const self& x, const self& y) {

  assert(x.step == y.step);

  return x.m < y.m;

 }

 friend difference type operator-(const self& x, const self& y) {

  assert(x.step == y.step);

  return (x.m - y.m) / x.step;

 }

 friend self operator+(const self& x, difference_type y) {

  assert(x.step == y.step);

  return x += y * x.step;

 }

 friend self operator+(difference_type x, const self& y) {

  assert(x.step == y.step);

  return y += x * x.step;

 }

private:

 Iter_T m;

 difference_type step;

};


#endif

Пример 11.25 показывает, как можно использовать итератор stride_iter из примера 11.24 для получения доступа к каждому второму элементу последовательности.

Пример 11.25. Применение итератора stride_iter

#include "stride_iter.hpp"

#include <algorithm>

#include <iterator>

#include <iostream>


using namespace std;


int main() {

 int a[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

 stride_iter<int*> first(a, 2);

 stride_iter<int*> last(a + 8, 2);

 copy(first, last, ostream_iterator<int>(cout, "\n"));

}

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

0

2

4

6

Обсуждение

Итераторы с шагом часто используются при работе с матрицами. Они обеспечивают простой и эффективный способ реализации матриц в виде набора числовых рядов. Представленная в примере 11.24 реализация итератора с шагом выполнена в виде оболочки другого итератора, который передается как параметр шаблона.

Я хотел сделать итератор с шагом совместимым с STL, поэтому пришлось выбрать подходящий тип стандартного итератора и удовлетворить его требования. Представленный в примере 11.24 итератор с шагом сделан по образцу итератора с произвольным доступом.

В примере 11.26 я отдельно привел реализацию итератора с шагом (названную kstride_iter), когда размер шага известен на этапе компиляции. Поскольку размер шага передается как параметр шаблона, компилятор может оптимизировать программный код итератора более эффективно, и размер итератора уменьшается.

Пример 11.26. kstride_iter.hpp

#ifndef KSTRIDE_ITER_HPP

#define KSTRIDE_ITER_HPP


#include <iterator>


template<class Iter_T, int Step_N>

class kstride_iter {

public:

 // открытые имена, вводимые typedef

 typedef typename std::iterator_traits<Iter_T>::value_type value_type;

 typedef typename std::iterator_traits<Iter_T>::reference reference;

 typedef typename std::iterator_traits<Iter_T>::difference_type

  difference_type;

 typedef typename std::iterator_traits<Iter_T>::pointer pointer;

 typedef std::random_access_iterator_tag iterator_category;

 typedef kstride_iter self;


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

 kstride_iter() : m(NULL) {} kstride_iter(const self& x) : m(x.m) {}

 explicit kstride_iter(Iter_T x) : m(x) {}


 // операторы

 self& operator++() { m += Step_N; return *this; }

 self operator++(int) { self tmp = *this; m += Step_N; return tmp; }

 self& operator+=(difference_type x) { m += x * Step_N; return *this; }

 self& operator--() { m -= Step_N; return *this; }

 self operator--(int) { self tmp = *this; m -= Step_N; return tmp; }

 self& operator--(difference_type x) { m -= x * Step_N; return *this; }

 reference operator[](difference_type n) { return m[n * Step_N]; }

 reference operator*() { return *m; }


 // дружественные операторы

 friend bool operator==(self x, self y) { return x.m == y.m; }

 friend bool operator!=(self x, self y) { return x.m != y.m; }

 friend bool operator<(self x, self y) { return x.m < y.m; }

 friend difference_type operator-(self x, self y) {

  return (x.m - y.m) / Step_N;

 }


 friend self operator+(self x, difference_type y) { return x += y * Step_N; }

 friend self operator+(difference_type x, self y) { return y += x * Step_N; }

private:

 Iter_T m;

};


#endif

Пример 11.27 показывает, как можно использовать итератор kstride_iter.

Пример 11.27. Применение итератора kstride_iter

#include "kstride_iter.hpp"

#include <algorithm>

#include <iterator>

#include <iostream>


using namespace std;


int main() {

 int a[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

 kstride_iter<int*, 2> first(a);

 kstride_iter<int*, 2> last(a + 8);

 copy(first, last, ostream_iterator<int>(cout, "\n"));

}

11.14. Реализация динамической матрицы

Проблема

Требуется реализовать числовые матрицы, размерности которых (количество строк и столбцов) неизвестны на этапе компиляции.

Решение

В примере 11.28 показана универсальная и эффективная реализация класса динамической матрицы, использующая итератор с шагом из рецепта 11.12 и valarray.

Пример 11.28. matrix.hpp


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "C++. Сборник рецептов"

Книги похожие на "C++. Сборник рецептов" читать онлайн или скачать бесплатно полные версии.


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

Все книги автора Д. Стефенс

Д. Стефенс - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

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

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

А что Вы думаете о книге? Оставьте Ваш отзыв.