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

Интервал:

Закладка:

Сделать

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

#include

#include

using namespace std;

int main() {

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

kstride_iter first(a);

kstride_iter last(a + 8);

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

}

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

Проблема

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

Решение

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

Пример 11.28. matrix.hpp

#ifndef MATRIX_HPP

#define MATRIX_HPP

#include "stride_iter.hpp" // см. рецепт 11.12

#include

#include

#include

template

class matrix {

public:

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

typedef Value_T value_type;

typedef matrix self;

typedef value_type* iterator;

typedef const value_type* const_iterator;

typedef Value_T* row_type;

typedef stride_iter col_type;

typedef const value_type* const_row_type;

typedef stride_iter const_col_type;

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

matrix() : nrows(0), ncols(0), m() {}

matrix(int r, int c) : nrows(r), ncols(c), m(r * с) {}

matrix(const self& x) : m(x.m), nrows(x.nrows), ncols(x.ncols) {}

template

explicit matrix(const valarray& x)

: m(x.size() + 1), nrows(x.size()), ncols(1) {

for (int i=0; i

}

// позволить конструирование из матриц других типов

template explicit matrix(const matrix& x)

: m(x.size() + 1), nrows(x.nrows), ncols(x.ncols) {

copy(x.begin(), x.end(), m.begin());

}

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

int rows() const { return nrows; }

int cols() const { return ncols; }

int size() const { return nrows * ncols; }

// доступ к элементам

row_type row begin(int n) { return &m[n * cols()]; }

row_type row_end(int n) { return row_begin() + cols(); }

col_type col_begin(int n) { return col_type(&m[n], cols()); }

col_type col_end(int n) { return col_begin(n) + cols(); }

const_row_type row_begin(int n) const { return &m[n * cols()]; }

const_row_type row_end(int n) const { return row_begin() + cols(); }

const_col_type col_begin(int n) const { return col_type(&m[n], cols()); }

const_col_type col_end(int n) const { return col_begin() + cols(); }

iterator begin() { return &m[0]; }

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

const_iterator begin() const { return &m[0]; }

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

// операторы

self& operator=(const self& x) {

m = x.m;

nrows = x.nrows;

ncols = x.ncols;

return *this;

}

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

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

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

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%=(value_type x) { m %= x; return *this; }

self operator-() { return -m; }

self operator+() { return +m; }

self operator!() { return !m; }

self operator~() { return ~m; }

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

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

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

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

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

friend self operator*(const self& x, value type y) { return self(x) *= y; }

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

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

private:

mutable valarray m;

int nrows;

int ncols;

};

#endif

Пример 11.29 показывает, как можно использовать шаблонный класс matrix.

Пример 11.29. Применение шаблона matrix

#include "matrix.hpp"

#include

using namespace std;

int main() {

matrix m(2,2);

m = 0;

m[0][0] = 1;

m[1][1] = 1;

m *= 2;

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

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

}

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

(2,0)

(0,2)

Обсуждение

Проект шаблона матрицы, представленный в примере 11.28, в значительной степени инспирирован шаблоном матрицы Бьерна Страуструпа (Bjarne Stroustrup) из его книги « The C++ Programming Language », 3-е издание (издательство «Addison Wesley»). Реализация Страуструпа отличается тем, что его итератор использует класс sliceи указатель на valarrayдля индексации. Реализованная в примере 11.27 матрица использует вместо них итератор с шагом из рецепта 11.12, что делает итераторы более компактными и при некоторых реализациях более эффективными.

Шаблонный класс matrixпозволяет индексировать элемент i -й строки и j -го столбца, используя операцию двойной индексации. Например:

matrix m(100,100);

cout << "the element at row 24 and column 42 is " << m[24][42] << endl;

Шаблонный класс matrixтакже имеет функции-члены beginи end, т.е. его легко можно использовать в различных алгоритмах STL.

Пример 11.28 содержит строку, которая, возможно, вызывает у вас некоторое удивление. Имеется в виду следующее объявление.

mutable valarray m;

Объявление поля-члена mсо спецификатором mutableвынужденно. В противном случае я не мог бы обеспечить итераторы со спецификатором const, потому что нельзя создать итератор для const valarray.

Смотри также

Рецепты 11.15 и 11.16.

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

Проблема

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

Решение

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

Пример 11.30. kmatrix.hpp

#ifndef KMATRIX_HPP

#define KMATRIX_HPP

#include "kvector.hpp"

#include "kstride_iter.hpp"

template

class kmatrix {

public:

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

typedef Value_T value_type;

typedef kmatrix self;

typedef Value_T* iterator;

typedef const Value_T* const_iterator;

typedef kstride_iter row_type;

typedef kstride_iter col_type;

typedef kstride_iter const_row_type;

typedef kstride_iter const_col_type;

// открытые константы

static const int nRows = Rows_N;

static const int nCols = Cols_N;

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

kmatrix() { m = Value_T(); }

kmatrix(const self& x) { m = x.m; }

explicit kmatrix(Value_T& x) { m = x.m; }

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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