Контейнер Vector – динамический массив 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Контейнер Vector – динамический массив



Вектор – самый популярный контейнер. Это массив объектов, основное и замечательное отличие которого от обычных массивов в том, что память, занимаемая массивом объектов, может меняться при выполнении программы. Для обычных массивов это невозможно: либо память выделяется статически при описании int a[100], либо при выполнении программы a = new int [n], а затем изменяться не может (только освободить память и взять заново). В классе вектор имеется 4 конструктора:

· vector() – конструктор по умолчанию, пустой вектор;

 

 vector <int> v;

 

· vector(кол-во[, знач.]) – количество элементов со значением знач

vector <char> s(10, ’*’);

·  vector(итератор_начала, итератор_конца) – инициализация диапозоном

· vector(объект_контейнер) – конструктор копирования

 

vector<char> s1(s);

 

К элементам вектора можно обращаться по индексу или через итератор (указатель), как и для обычных массивов (a[i] или *(a + i)).

В классе vector перегружены операции сравнения

==   <   <=   !=   >   >=

и определено 33 ч/функции.

Назовем основные функции:

size () – текущий размер массива,

push _ back (знач) – поместить значение в конец массива, size() растет,

pop _ back () – удаляет последний элемент, size() уменьшается,

begin () – возвращает итератор начала вектора,

end () – возвращает итератор конца вектора,

insert (итератор, значение) – вставляет в массив значение перед элементом, указанным итератором,

erase (итератор) – удаляет элемент, на который указывает итератор, возвращает итератор элемента за удаленным,

clear () – удаляет все элементы вектора,

empty () – возвращает истину, если вектор пуст, и ложь, если нет.

Заметим, что во всех контейнерах набор перегруженных операций и член-функций практически одинаковый, кроме некоторых специфических для данного класса.

Пример 1. Из созданного массива случайных чисел переписать в другой массив четные числа

#include  <iostream.h>

#include  <vector.h>

#include  <stdlib.h>

#include  <conio.h>

void  main()

{ vector  <int>  v1, v2;         // 2 пустых массива

int i,j;

randomize();

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

  v1.push_back(random(30)); // поместить в конец – размер растет

cout << "Создан массив:\n";

for(i = 0; i < v1.size(); i++)  // цикл по размеру

  cout << v1[i] << ' ';

for(i = 0; i < v1.size(); i++)

  if(v1[i] % 2 == 0) v2.push_back(v1[i]); // добавить в v2 четные

cout << "\nЧетные числа:\n" << v2.size() << endl;

for(i = 0; i < v2.size(); i++)         // v2.size() – сколько добавили

  cout << v2[i] << ' ';

getch();

}

 

Пример 2. Из созданного массива случайных чисел удалить нули. Используется итератор.

 

#include  <iostream.h>

#include  <vector.h>

#include  <stdlib.h>

void  main()

{vector  <int>  v; int   i, j;

  randomize();

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

v.push_back(random(5));

  cout << "Создан массив:\n";

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

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

  vector <int>:: iterator  pv = v.begin(); // эквивалентно  int *pv = v;

  while (pv!= v.end())

{if (*pv == 0)

pv = v.erase(pv);         //удалить нуль и сократить массив

 else   pv++;}

  cout << "\n Осталось элементов " << v.size() << ":\n";

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

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

// или используя итератор

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

cout << *p << ' ';

*/

}

Контейнер list – список

 

 Этот контейнер реализует двунаправленный линейный список, в котором используется последовательный доступ с начала или конца списка. Элемент списка имеет структуру:

В классе имеется 4 конструктора, перегружены операции сравнения и определены 42 член-функции. Так как список двунаправленный, то добавление и удаление выполняется как с начала, так и с конца. Ниже на рисунке приведены основные операции для работы со списком

 

push _ front ( значение ) – добавить в начало,

push _ back ( значение ) – добавить в конец,

pop _ front () – удалить с начала,

pop _ back () – удалить с конца,

insert ( итератор,значение ) – вставить в середину, место указывается итератором,

erase ( итератор ) – удалить из середины, место указывается итератором,

front () – возвращается значение элемента с начала списка,

back () – возвращается значение элемента с конца списка.

Пример. Сортировка прямым выбором: минимальное число находится в исходном списке, удаляется из него и добавляется в новый список

 

#include <list.h>

#include  <iostream.h>

#include  <conio.h>

int   main(int argc, char* argv[])

{list  <int> l1, l2;

 int  i, k;

 cout << "\nlist:";

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

l1.push_back(random(30));

 list <int>:: iterator  pl, pmin;

cout << "\nВывод через Iterator:";

   for(pl = l1.begin(); pl!= l1.end(); pl++)

cout << *pl << ' ';

 while (!l1.empty())

{pmin = min_element(l1.begin(),l1.end()); // из  algorithm.h

 l2.push_back(*pmin);     // добавить в список l2

 l1.erase(pmin);             // удалить минимум из списка l1

}

 cout << "\n rezult: ";

 for(pl = l2.begin(); pl!= l2.end(); pl++)

cout << *pl << ' ';

return 0;

}

Контейнер Set – множество

Контейнер Set определяет математическое множество объектов. Основное достоинство класса в том, что во множество не добавляются одинаковые объекты. Добавление во множество, в отличие от предыдущих контейнеров, выполняется функцией класса insert ( значение ).

Пример. Определить множество различных символов в заданном тексте.

 

#include  <set.h>

#include  <string.h>

#include  <conio.h>

#include  <iostream.h>

int   main(int argc, char* argv[])

 {set  <char>  s;

char  * ss = “программируйте, улыбаясь!”;

for(int  i = 0; i < ss[i]; i++)

s.insert(ss[i]);

set <char>:: iterator  ps;

cout << "\nsize set = " << s.size();   // 20 различных символов

for(ps = s.begin(); ps!= s.end();ps++) // вывод их, используя итератор

cout << *ps;

return  0;

 }


Содержание

 

Введение. Принципы объектно-ориентированного программирования

Глава 1. Классы и объекты

1. Новые возможности языка С++

1.1. Операция разрешения области видимости::

1.2. Перечислимый тип.

1.3. Модификатор const

1.4.Новый тип данных – ссылка &.

1.5. Функции в Си++

2. Определение класса. Сокрытие информации.

3. Объект.

4. Конструкторы и деструкторы

4.1.Назначение конструктора

4.2. Конструктор копирования.

4.3. Деструктор

5. Неявный указатель this

6. Перегрузка операций

7. Примеры перегрузки некоторых операций

7.1. Перегрузка операции [ ]

7.2. Перегрузка операции ()

7.3. Перегрузка операции =

7.4. Перегрузки операций + и +=

7.5. Перегрузка операции ++

7.6. Перегрузка операции (тип)

8. Дружественность

9. Перегрузка операций потокового ввода >> и вывода <<.

10. Массивы объектов.

11. Функции- и классы-шаблоны

11.1 Функции-шаблоны (родовые функции)

11.2. Классы-шаблоны

12. Член-данные класса – объекты другого класса: агрегированные классы.

Глава 2. Наследование. Полиморфизм

1. Базовый и порожденный классы

2. Конструкторы порожденного класса

3. Стандартные преобразования при наследовании

4. Множественное наследование. Виртуальный базовый класс

4.1. Прямые базовые классы

4.2. Виртуальный базовый класс

5. Полиморфизм, раннее и позднее связывание, виртуальные функции

5.1 Раннее (статическое) и позднее (динамическое) связывание

5.2. Определение виртуальной функции

5.3. Чистая виртуальная функция и абстрактный класс

5.4. Правила определения виртуальных функций

5.5. Механизм позднего связывания

 

6. Библиотека fstream – работа с файлами

Глава 3. Библиотека стандартных шаблонов (БСШ). Контейнеры

1. Контейнер. Структура БСШ.

2. Контейнер Vector – динамический массив

Контейнер list – список

4. Контейнер Set – множество

Содержание

 

 



Поделиться:


Последнее изменение этой страницы: 2021-12-07; просмотров: 102; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.222.12 (0.018 с.)