Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Шаблон вектор

Читайте также:
  1. Алгоритм 13.3. Шаблоны со случайным выбором.
  2. В результате этих действий будет найден вектор валового выпуска Х.
  3. Вектор картины жизни.
  4. Вектор Номер Адресная функция
  5. Векторизация
  6. ВЕКТОРКАРДИОГРАФИЯ
  7. Векторная графика

Стандартная библиотека шаблонов

СБШ, или STL содержит набор шаблонов, представляющих контейнеры, итераторы, функциональные объекты и алгоритмы.

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

Итераторы – это объекты, позволяющие передвигаться по объекту-контейнеру так же, как обычные указатели позволяют передвигаться по массиву; они являются обобщением указателей.

 

ШАБЛОН ВЕКТОР

Шаблон класса vector определён в заголовочном файле vector.

#include <vector>

Для создания объекта шаблона vector применяется обычная запись <type>, в которой содержится информация о том, какой тип будет использован:

vector<int> u;

vector<float> v;

vector<double> w;

 

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

 

#include "stdafx.h"

#include <vector>

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

vector<int> v(5);// вектор из 5 элементов

int n;

cin>>n;

vector<double> w(n);// вектор из n элементов

...

}

После создания векторного объекта перегрузка оператора [] позволяет использовать обычную форму записи массива для доступа к отдельным элементам:

v[0]=8;

for (int i=0 i<n; i++)

cout>>’ ‘>>w[i];

здесь используются обозначения v[0], w[i].

 

Упражнение 1. Выполните программу.

В листинге демонстрируется использование класса vector:

 

#include "stdafx.h"

#include <vector>

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

vector<int> v(5);

int i;

for(i=0;i<5;i++)

cin>>v[i];

 

for(i=0;i<5;i++)

cout<<' '<<v[i];

cout<<endl;

system("pause");

return 0; }

Все контейнеры обеспечивают определённые базовые методы:

size() - Возвращает количество элементов в контейнере

swap() - Производит обмен двух контейнеров

begin() - Возвращает итератор, ссылающийся на первый элемент контейнера

end() - Возвращает итератор, ссылающийся на за пределами контейнера

 

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

Чтобы объявить, например, итератор для объекта vector специализации double,

vector <double> v;

необходимо выполнить следующее:

vector<double>::iterator p;

Тогда итератор р можно использовать в следующих целях:

P=v.begin(); - указывать с помощью р на первый элемент

*p=3.14; - разыменовать итератор р и присвоить значение элементу, на который указывает итератор

++p - сделать р на следующий элемент

Если установить итератор на первый элемент контейнера, а затем увеличивать его значение, т.е. итератор достигнет конца контейнера, т.е. всё содержимое контейнера будет просмотрено:

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

cout<<' '<<*p;

cout<<endl;

 

push_back()- добавляет элемент в конец вектора. Происходит обращение к механизму управления памятью, чтобы увеличить размер вектора для размещения добавляемых элементов. Это значит, что можно применять код:

vector <double> v;

double t;

while (cin >> t && t >= 0)

v.push_back(t);

cout<<”size=“<<v.size()<<endl;

 

Упражнение 2. Выполните программу и объясните все действия.

#include "stdafx.h"

#include <vector>

#include <iostream>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

vector<int> v;//создать пустой вектор

v.push_back(10);

v.push_back(20);

 

vector<int>::iterator pv=v.begin();

 

while (pv!=v.end()){

cout<<' '<<*pv;

pv++;

}

cout<<endl;

system("pause");

return 0;

}

Метод erase() предназначен для удаления заданного диапазона вектора. Он имеет два аргумента-итератора, определяющих нужный диапазон.

v.erase(v.begin(),v.begin()+2); - удаляет первый и второй элементы, т.е. элементы, на которые указывают begin()и begin()+1.

 

Метод insert() дополняет метод erase(). Он имеет три аргумента-итератора. Первый задаёт позицию, в которую будет вставлен новый элемент. Второй и третий определяют диапазон, который будет вставлен. Этот диапазон, как правило, является частью другого объекта.

vector<int> v1;

vector<int> v1;

...

V1.insert(v1.begin(),v2.begin()+1,v2.end());

Все элементы, кроме первого, вектора v2 вставляются перед первым элементом вектора v1.

 

 

Упражнение 3. Объясните все действия программы. Внесите изменения

1)вектор v2 заполняйте половинными значениями вектора v1

2)напишите функцию вывода вектора и её применяйте при выводе

3)добавьте вектор v2 в конец вектора v1

4)найдите максимальный элемент в векторе v1 и указатель на него, используя итератор

5)поменяйте значения у нулевого и максимального элементов вектора, используя итератор

6)выведите вектор в обратном порядке, используя итератор

 

#include "stdafx.h"

#include <vector>

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

vector <double> v1,v2;

vector<double>::iterator p1,p2;

double temp;

 

//ввод векторов

while (cin>>temp &&temp>=0)

{v1.push_back(temp);

v2.push_back(temp+1);}

 

//вывод векторов

for(p1=v1.begin(); p1!=v1.end(); p1++)

cout<<' '<<*p1;

cout<<endl;

 

for(p2=v2.begin(); p2!=v2.end(); p2++)

cout<<' '<<*p2;

cout<<endl;

 

//удаление

v1.erase(v1.begin()+1,v1.begin()+3);

for(p1=v1.begin(); p1!=v1.end(); p1++)

cout<<' '<<*p1;

cout<<endl;

 

//вставка

v1.insert(v1.begin(),v2.begin()+1,v2.begin()+3);

for(p1=v1.begin(); p1!=v1.end(); p1++)

cout<<' '<<*p1;

cout<<endl;

 

//обмен

v1.swap(v2);

for(p1=v1.begin(); p1!=v1.end(); p1++)

cout<<' '<<*p1;

cout<<endl;

 

for(p2=v2.begin(); p2!=v2.end(); p2++)

cout<<' '<<*p2;

cout<<endl;

system("pause");

return 0;}

Функцию for_each() можно использовать с любым классом-контейнером. Она имеет три аргумента. Первые два являются итераторами, задающими диапазон в контейнере, а последний представляет собой указатель на функцию. Функция for_each()применяет функцию, на которую указывает указатель к каждому элементу-контейнеру в диапазоне.

Например, следующий код:

 

#include <string>

#include <vector>

 

Struct review{

string title;

int rating;

};

 

void ShowReview(const review &r);

 

int main()

{

vector <review> v;

vector< review >::iterator p;

…...

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

ShowReview(*p);

 

можно заменить таким;

for_each(v.begin(), v.end(),ShowReview);

 

 

Функция random_shuffle() включает два итератоа, задающих диапазон. В этом диапазоне она переставляет элементы в случайном порядке.

Например,

random_shuffle(a.begin(), a.end());

случайным образом переставляются все элементы в векторе a.

Функция sort() имеет две версии. Первая версия использует два итератора, задающих диапазон, и сортирует его, применяя оператор <, определенный для элементов того типа, который сохранен в контейнере

vector<int> a;

sort(a.begin(), a.end());

 

Если элементы контейнера являются объектами, заданными пользователем, то требуется функция operator<(), определенная для работы с такими объектами (чтобы можно было использовать функцию sort().

bool operator<(const review &r1, const review &r2)

{...}

 

 


Дата добавления: 2015-07-10; просмотров: 175 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Расписание работы лыжных баз Красноярска зимой 2012-13 гг.| Недопустимо наличие яркого макияжа, резких запахов любого происхождения, работа в уличной обуви.

mybiblioteka.su - 2015-2024 год. (0.015 сек.)