Читать «Полный справочник по С++» онлайн - страница 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;
}
Результат работы этой программы выглядит следующим образом.