Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

int s = a.size;  // количество элементов

int d1 = a.dim1; // количество элементов в строке

int d2 = a.dim2; // количество элементов в столбце

int* p = a.data; // извлекаем данные с помощью указателя в стиле

                   // языка С

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

Мы можем использовать индексы.

a(i,j);  // (i,j)-й элемент (в стиле языка Fortran) с проверкой

         // диапазона

a[i];    // i-я строка (в стиле языка C) с проверкой диапазона

a[i][j]; // (i,j)-й элемент (в стиле языка C)

  В двумерном объекте класса Matrix индексирование с помощью конструкции [i] создает одномерный объект класса Matrix, представляющий собой i-ю строку. Это значит, что мы можем извлекать строки и передавать их операторам и функциям, получающим в качестве аргументов одномерные объекты класса Matrix и даже встроенные массивы (a[i].data). Обратите внимание на то, что индексирование вида a(i,j) может оказаться быстрее, чем индексирование вида a[i][j], хотя это сильно зависит от компилятора и оптимизатора.

Мы можем получить срезки.

a.slice(i);   // строки от a[i] до последней

a.slice(i,n); // строки от a[i] до a[i+n–1]

Срезка двумерного объекта класса Matrix сама является двумерным объектом этого класса (возможно, с меньшим количеством строк). Распределенные операции над двумерными матрицами такие же, как и над одномерными. Этим операциям неважно, как именно хранятся элементы; они просто применяются ко всем элементам в порядке их следования в памяти.

Matrix a2 = a; // копирующая инициализация

a = a2;          // копирующее присваивание

a *= 7;          // пересчет (и +=, –=, /= и т.д.)

a.apply(f);      // a(i,j)=f(a(i,j)) для каждого элемента a(i,j)

a.apply(f,7);    // a(i,j)=f(a(i,j),7) для каждого элемента a(i,j)

b=apply(f,a);    // создаем новую матрицу с b(i,j)==f(a(i,j))

b=apply(f,a,7);  // создаем новую матрицу с b(i,j)==f(a(i,j),7)

Оказывается, что перестановка строк также полезна, поэтому мы предусмотрим и ее.

a.swap_rows(1,2); // перестановка строк a[1] <–> a[2]

  Перестановки столбцов swap_columns не существует. Если она вам потребуется, то вы сможете написать ее самостоятельно (см. упр. 11). Из-за построчной схемы хранения матриц в памяти строки и столбцы не совсем равноправны. Эта асимметрия проявляется также в том, что оператор [i] возвращает только строку (а для столбцов аналогичный оператор не предусмотрен). Итак, в тройке (i,j) первый индекс i выбирает строку. Эта асимметрия имеет глубокие математические корни.

Количество действий, которые можно было бы выполнить над двумерными матрицами, кажется бесконечным.

enum Piece { none, pawn, knight, queen, king, bishop, rook };

Matrix board(8,8); // шахматная доска

const int white_start_row = 0;

const int black_start_row = 7;

Piece init_pos[] = {rook,knight,bishop, queen,king,bishop,knight,rook};

Matrix start_row(init_pos); // инициализация элементов из

                                   // init_pos

Matrix clear_row(8);        // 8 элементов со значениями

                                   // по умолчанию

Инициализация объекта clear_row использует возможность задать условие none==0 и то, что эти элементы по умолчанию инициализируются нулем. Мы могли бы предпочесть другой код.

Matrix start_row = {rook,knight,bishop,queen,king,bishop,knight,rook};

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

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

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT