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

Здесь есть возможность читать онлайн «Д. Стефенс - C++. Сборник рецептов» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: КУДИЦ-ПРЕСС, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

C++. Сборник рецептов: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «C++. Сборник рецептов»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

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

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «C++. Сборник рецептов», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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, определенного в заголовочном файле .

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

Интервал:

Закладка:

Сделать

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

Представляем Вашему вниманию похожие книги на «C++. Сборник рецептов» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


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

Обсуждение, отзывы о книге «C++. Сборник рецептов» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.