Читать «Полный справочник по С++» онлайн - страница 420

Герберт Шилдт

Исходное содержимое: 0123456789 Сдвинутое содержимое: 3456789012 Эти элементы меньше 5: 1100000111

Исходное содержимое: 0 12 3 4 Квадратные корни: 0 1 1.41421 1.73205 2

I Удвоенные квадратные корни: 0 2 2.82843 3.4641 4 После вычитания числа 10 из каждого элемента:

-10 -8 -7.17157 -6.5359 -6

Классы slice и gslice

В заголовке <valarray> определены два служебных класса: slice и gslice. Эти классы инкапсулируют сечение (т.е. часть) массива. Они используют операторную функцию operator [], определенную для подмножеств типа valarray.

Класс slice выглядит следующим образом.

class slice { public: slice();

slice(size_t start, size_t len, size_t interval); size_t start() const; size_t sizeO const; size_t strideO;

} ;

Первый конструктор создает пустое сечение. Второй конструктор создает сечение по заданным первому элементу, длине и величине интервала между элементами (т.е. по шагу индекса (stride)). Эти значения вычисляются с помощью функций-членов. Рассмотрим программу, демонстрирующую применение класса slice.

// Демонстрация класса slice.

♦include <iostream>

♦include <valarray> using namespace std;

int mainO {

valarray<int> v(10), result; int i;

for(i=0; i<10; i++) v[i] = i;

cout << "Содержимое массива v: for(i=0; i<10; i++) cout « v[i] « " ”; cout << endl;

result = v[slice(0, 5, 2) ] ;

cout « "Результат: “; for(i=0; i<result.size(); i++) cout « result[i] « ■

return 0;

Результаты работы этой программы приведены ниже.

■Содержимое массива v: 0123456789 Результат: 0 2 4 6 8

Как видим, результирующий массив состоит из пяти элементов массива v, начиная с 0, причем разность между индексами соседних элементов равна 2.

Класс gslice состоит из следующих членов.

class gslice ( public:

gslice();

gslice()(size_t start, const vallaray<size_t> &len, const valiaray<size_t> Scintervals) ; size_t start() const; vallaray<size_t> sized const; valarray<size_t> stride() const:

} ;

Первый конструктор создает пустое сечение. Второй конструктор создаст сечение по заданным первому элементу, длине и величине интервала между элементами (т.е. по шагу индекса (stride)). Количество элементов массивов lens и intervals должно совпадать. Эти значения вычисляются с помощью функций-членов. Класс gslice применяется для создания многомерных массивов на основе объекта класса valarray. который по определению всегда является одномерным.

Следующая программа демонстрирует применение класса gslice.

// Демонстрация класса gslice.

♦include <iostream>

♦include <valarray> using namespace std;

int main()

{

valarray<int> v(12), result; valarray<size_t> len(2). interval(2); int i ;

for(i=0; i<12; i++) v[i] = i;

len[0] = 3; len[l] = 3; interval[0] = 2; interval[1] = 3;

cout « "Содержимое массива v: “; for(i=0; i<12; i++) cout <<i v[i] « ” ”; cout << endl;

result = v[gslice(0,len,interval)],

cout « "Результат: for(i=0; i<result. size () ,- i++) cout << result[i] << "

return 0;

}

Результат работы этой программы выглядит следующим образом.