Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП на языке С++.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.8 Mб
Скачать

8.5. Многомерные массивы

Многомерный массив можно представить как вектор с компонентами типа вектор

vector<vector<int>> v;

Так создаётся вектор векторов с целыми элементами, который в начале не содержит ни одного элемента. Проинициализируем его в матрицу 3х5.

v.resize(3);//теперь вектор содержит три пустых вектора

for(int i=0;i<v.size();i++)

{v[i].resize(5);//каждый из векторов содержит пять элементов

//проинициализируем их

for(int j=0;j<v[i].size();j++)v[i][j]=10*i+j;}

Вектора vector<int> в векторе vector<vector<int>> не обязаны иметь один и тот же размер.

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

м v:

33

vv[0]:

5

5

00

01

02

03

04

vv[1]:

5

5

110

111

112

113

114

vv[2]:

55 5

220

221

222

223

224

Доступ к элементам осуществляется путем двойного индексирования.

for(int i=0;i<v.size();i++){

for(int j=0;j<v[i].size();j++)cout<<v[i][j]<<“ ”;

Можно перегрузить операции << и >> для вектора.

ostream& operator<<(ostream& out,const vector<int>& v){

vector<int>::iterator p;

for(p=v.begin();p!=v.end();++p)out<<*p<<’\t’;

out<<endl;

return out;}

istream& operator>>(istream& in,vector<int>& v){

vector<int>::iterator p;

for(p=v.begin();p!=v.end();++p)in>>*p;

return in;}

Можно написать также функцию суммирования элементов вектора

int sum(vector<int>::iterator first,vector<int>::iterator last,

int initial_val)

{vector<int>::iterator p;

int sum=initial_val;

for(p=first;p!=last;p++)sum+=*p;

return sum;

}

Программа 8.1. Напишите функцию быстрой сортировки массива целых чисел.

Функцию быстрой сортировки сложно запрограммировать из-за многочисленных индексов, которые отслеживаются в традиционной реализации. Мы будем использовать контейнер vector и заменим индексирование итераторами.

Вначале запишем рекурсивную функцию сортировки:

void quicksort(vector<int>::iterator from,vector<int>::iterator to)

{

vector<int>::iterator mid;

if(from<(to-1)){

mid=partition(from,to);

quicksort(from,mid);

quicksort(mid+1,to);}

}

Здесь используется функция partition, которая в соответствиии с алгоритмом разделяет массив на две части.

Запишем эту функцию.

vector<int>::iterator

partition(vector<int> :: iterator from, vector <int> :: iterator to)

{

vector<int>::iterator front=from+1;

vector<int>::iterator back=to-1;

int compare=*from;

while(front<back){

while((front<back)&&(compare>*front))++front;

while((front<back)&&(compare<=*back))--back;

swap(*front,*back);}

if(compare>*front)

{swap(*from,*front);

return front;}

else{

swap(*from,*(front-1));

return front-1;}

}

Используемая здесь функция swap() меняет местами два элемента.

inline void swap(int& i,int& j)

{int temp=i;

i=j;

j=temp;}

Напишем также функцию print() для вывода массива:

void print(vector<int> v)

{

for(int i=0;i<v.size();i++)cout<<v[i]<<' ';

cout<<endl;

}

И,наконец, запишем функцию main():

int main()

{

srand( (unsigned)time( NULL ) );

vector<int> v(10);

for(int i=0;i<v.size();i++)v[i]=rand()/10;

print(v);

quicksort(v.begin(),v.end());

print(v);

return 0;

}

Не забудьте подключить заголовочные файлы и указать пространство имен

#include<iostream>

#include<vector>

#include <stdio.h>

#include <time.h>

using namespace std;

В программе определяется вектор, заполняется случайными числами и сортируется.

В качестве самостоятельной работы напишите шаблон функции быстрой сортировки последовательностей любого типа.