Д. Стефенс - 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++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

// открытые функции

static int rows() { return Rows_N; }

static int cols() { return Cols_N; }

row_type row(int n) { return row_type(begin() * (n * Cols_N)); }

col_type col(int n) { return col_type(begin() + n); }

const_row_type row(int n) const {

return const_row_type(begin() + (n * Cols_N));

}

const_col_type col(int n) const {

return const_col_type(begin() + n);

}

iterator begin() { return m.begin(); }

iterator end() { return m.begin() + size(); }

const_iterator begin() const { return m; }

const_iterator end() const { return m + size(); }

static int size() { return Rows_N * Cols_N; }

// операторы

row_type operator[](int n) { return row(n); }

const_row_type operator[](int n) const { return row(n); }

// операции присваивания

self& operator=(const self& x) { m = x.m; return *this; }

self& operator=(value_type x) { m = x; return *this; }

self& operator+=(const self& x) { m += x.m; return *this; }

self& operator-=(const self& x) { m -= x.m; return *this; }

self& operator+={value_type x) { m += x; return *this; }

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

self& operator*=(value_type x) { m *= x; return *this; }

self& operator/=(value_type x) { m /= x; return *this; }

self operator-() { return self(-m); }

// друзья

friend self operator+(self x, const self& у) { return x += y; }

friend self operator-(self x, const self& y) { return x -= y; }

friend self operator+(self x, value_type y) { return x += y; }

friend self operator-(self x, value type y) { return x -= y; }

friend self operator*(self x, value_type y) { return x *= y; }

friend self operator/(self x, value_type y) { return x /= y; }

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

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

private:

kvector m;

};

#endif

В примере 11.31 приведена программа, демонстрирующая применение шаблонного класса kmatrix.

Пример 11.31. Применение kmatrix

#include "kmatrix.hpp"

#include

using namespace std;

template

void outputRowOrColumn(Iter_T iter, int n) {

for (int i=0; i < n; ++i) {

cout << iter[i] << " ";

}

cout << endl;

}

template

void initializeMatrix(Matrix_T& m) {

int k = 0;

for (int i=0; i < m.rows(); ++i) {

for (int j=0; j < m.cols(); ++j) {

m[i][j] = k++;

}

}

}

template

void outputMatrix(Matrix_T& m) {

for (int i=0; i < m.rows(); ++i) {

cout << "Row " << i << " = ";

outputRowOrColumn(m.row(i), m.cols());

}

for (int i=0; i < m.cols(); ++i) {

cout << "Column " << i << " = ";

outputRowOrColumn(m.col(i), m.rows());

}

}

int main() {

kmatrix m;

initializeMatrix(m); m *= 2;

outputMatrix(m);

}

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

Row 0 = 0 2 4 6

Row 1 = 8 10 12 14

Column 0 = 0 8

Column 1 = 2 10

Column 2 = 4 12

Column 3 = 6 14

Обсуждение

Представленные в примерах 11.30 и 11.31 определение шаблона класса kmatrixи пример его использования очень напоминают шаблон класса matrixиз рецепта 11.14. Единственным существенным отличием является то, что при объявлении экземпляра kmatrixприходится передавать размерности матрицы через параметры шаблона, например;

kmatrix m; // объявляет матрицу с пятью строками и шестью

// столбцами

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

картинка 66Как и рассмотренный ранее шаблон статического вектора ( kvector), шаблон kmatrixособенно эффективен при небольших размерах матрицы.

Смотри также

Рецепты 11.14 и 11.16.

11.16. Умножение матриц

Проблема

Требуется эффективно выполнить умножение двух матриц.

Решение

Пример 11.32 показывает, как можно выполнить умножение матриц, причем эта реализация подходит как для динамических, так и для статических матриц. Формально этот алгоритм реализует соотношение A=A+B*C, которое (возможно, неожиданно) вычисляется более эффективно, чем A=B*C.

Пример 11.32. Умножение матриц

#include "matrix.hpp" // рецепт 11.13

#include "kmatrix.hpp" // рецепт 11.14

#include

#include

using namespace std;

template

void matrixMultiply(const M1& m1, const M2& m2, M3& m3) {

assert(m1.cols() == m2.rows());

assert(m1.rows() == m3.rows());

assert(m2.cols() == m3.cols());

for (int i=m1.rows()-1; i >= 0; --i) {

for (int j=m2.cols()-1; j >= 0; --j) {

for (int k = m1.cols()-1; k >= 0; --k) {

m3[i][j] += m1[i][k] * m2[k][j];

}

}

}

}

int main() {

matrix m1(2, 1);

matrix m2(1, 2);

kmatrix m3;

m3 = 0;

m1[0][0] = 1;

m1[1][0] = 2;

m2[0][0] = 3;

m2[0][1] = 4;

matrixMultlply(m1, m2, m3);

cout << "(" << m3[0][0] << ", " << m3[0][1] << ")" << endl;

cout << "(" << m3[1][0] << ", " << m3[1][1 ] << ")" << endl;

}

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

(3, 4)

(6, 8)

Обсуждение

При умножении двух матриц число столбцов первой матрицы должно равняться числу строк второй матрицы. Число строк полученной матрицы равно числу строк первой матрицы, а число столбцов равно числу столбцов второй матрицы. Я обеспечиваю эти условия в отладочной версии с помощью макроса assert, определенного в заголовочном файле .

Решающее значение для эффективной реализации умножения имеет отсутствие избыточных операций по созданию и копированию временных объектов. Так, представленная в примере 11.32 функция умножения матриц передает результат по ссылке. Если бы алгоритм умножения я реализовал впрямую путем перегрузки оператора operator*, это привело бы к лишним операциям распределения, копирования и освобождения памяти, занимаемой временной матрицей. Потенциально такой подход может оказаться очень затратным при работе с большими матрицами.

картинка 67В примере 11.32 реализуется равенство A=A+B*C, а не A=B*C, для того чтобы избежать лишней инициализации значений матрицы A.

Смотри также

Рецепт 11.17.

11.17. Вычисление быстрого преобразования Фурье

Проблема

Требуется выполнить эффективный расчет дискретного преобразования Фурье (ДПФ), используя алгоритм быстрого преобразования Фурье (БПФ).

Решение

Программный код примера 11.33 обеспечивает базовую реализацию БПФ.

Пример 11.33. Реализация БПФ

#include

#include

#include

#include

using namespace std;

unsigned int bitReverse(unsigned int x, int log2n) {

int n = 0;

int mask = 0x1;

for (int i=0; i < log2n; i++) {

n <<= 1;

n |= (x & 1);

x >>= 1;

}

return n;

}

const double PI = 3.1415926536;

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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