Ассоциативные контейнеры




Перечисления

Иноrда появляется необходимость описать в проrрамме собственный тип, содержащий оrраниченное количество значений. Сделать это можно, используя ключевое слово еnum, например:

еnum days {su, то, tu, we, th, fr, sa};

Так как для внутреннего представления элементов перечисления использу­ются целые значения, то можно определить тип

еnum modes {LASTMODE ­ =1, BW40­O, С40, BW80, С80, MONO= 7};

В котором значение LASTMODE равно ­1, значения С40, BW80 и С80 соответственно будут равны 3, 4 и 5, а MONO равно 7. Использование этих типов настолько же легко, как и целочисленных..

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

#include <iostream.h>

#include <vcl.h>

#include <conio.h>

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

{

enum modes {LASTMODE=1, BW40O, C40, BW80, C80, MONO=7};

std::cout << "LASTMODE " << LASTMODE << endl;

std::cout << " BW40O " << BW40O << endl;

std::cout << " C80 " << C80 << endl;

std::cout << " MONO " << MONO << endl;

getch();

return 0;

}

 

Задание 2. Получить результат программы и проанализировать его

#include <iostream.h>

#include <vcl.h>

#include <conio.h>

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

{ enum Color {Red,Green,Yellow }rr;

struct ccc

{ char Color[6];

};

ccc mc[3];

strcpy(mc[0].Color,"Red");

strcpy(mc[1].Color,"Green");

strcpy(mc[2].Color,"Yellow");

for (rr=Red; rr<= Yellow; rr=rr+1)

std::cout << "Color " << mc[rr].Color << endl;

getch();

return 0;

}

//---------------------------------------------------------------------------

Тип объединение union – определяет единственный адрес, по которому размещаются все его элементы.

Задание 3. Получить результат программы и проанализировать его

#include <iostream.h>

#include <vcl.h>

#include <conio.h>

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

{union ddd

{

char x[9];

char y[9];

} rr;

strcpy(rr.x,"My string");

cout << "rr.x=" << rr.x << endl;

cout << "rr.y=" << rr.y << endl;

getch();

return 0;

}

Пузырьковая сортировка

Если представить массив, например, из пяти элементов (4 3 5 2 1), «поставленный» вертикально, с нулевым элементом наверху и четвертым — внизу, то пузырьковая сортировка проходит по массиву снизу вверх. Каждый элемент массива сравнивается с тем, что находится непосредственно над ним, и если последний больше, производится перестановка двух этих элементов. Например, нижний элемент (с индексом 4 – это 1) оказывается наименьшим. Алгоритм сортировки сравнивает его со значением элемента с индексом 3 (который равен 2) и решает поменять их местами. Затем он сравнивает элемент с элементом с индексом 2 и также обменивает их. Процесс продолжается до тех пор, пока наименьший элемент не «всплывает», подобно пузырьку воздуха, на самый верх. В данный момент элемент с индексом 0 имеет правильное значение, и при последующих проходах алгоритма его можно игнорировать. Затем пузырьковая сортировка применяет ту же самую процедуру к подмассиву, состоящему из элементов с индексами от 1 до 4, в результате чего в позиции 1 также оказывается правильное значение (в данном случае 2). Сортировка продолжается в том же духе, сканируя все меньшие подмассивы, пока они не будут исчерпаны. К этому моменту весь массив будет правильно сортирован.

Задание 4. Выполнить пузырьковую сортировку

#include <iostream.h>

#include <conio.h>

#include <vcl.h>

inline void swap(int array[], int posl, int pos2)

{

int temp;

temp = array[posl];

array[posl] = array[pos2];

array[pos2] = temp;

}

inline void print(int array[], int size)

{

int i;

for (i=0; i < size; ++i) {

cout << array[i] << " ";

}

cout << endl;

}

inline void bubble_sort(int array[], int size)

{

int i, j;

for (i=0; i < size-1; ++i) {

for (j=size-1; j > i; --j)

{

if (array[j-1] > array[j]) swap(array, j-1, j);

}

}

}

int main()

{

int array_1[] = {7, 3, 8, 2, 1, 5, 4};

print(array_1, 7);

bubble_sort(array_1, 7);

print (array_1, 7);

cout << endl;

int array_2[] = {7, 3, 8, 2, 1, 5, 4, 9, 75, -5};

print(array_2, 10);

bubble_sort(array_2, 10);

print(array_2, 10);

cout << endl;

int array_3[] = {1, 2, 3};

print(array_3, 3);

bubble_sort(array_3, 3);

print(array_3, 3);

cout << endl;

int array_4[] = {3, 2, 1};

print(array_4, 3);

bubble_sort(array_4, 3);

print(array_4, 3);

cout << endl;

int array_5[] = {5, 2, 1, 3};

print(array_5, 4);

bubble_sort(array_5, 4);

print(array_5, 4);

cout << endl;

int array_6[] = {3, 3, 3};

print(array_6, 3);

bubble_sort(array_6, 3);

print(array_6, 3);

cout << endl;

getch();

return 0;

}

Выборочная сортировка

Хотя пузырьковая сортировка вполне работоспособна, она производит гораздо больше действий, чем это необходимо — даже для простого метода. Слабым местом ее, очевидно, является количество выполняемых перестановок, — вместо того, чтобы ставить каждый элемент сразу на его конечное место, она перемещает элементы каждый раз всего на одну позицию. Выборочная сортировка основана на том же основном принципе, что и пузырьковая, но решает эту ключевую проблему.

Если подвергнуть выборочной сортировке массив из предыдущего пункта, то алгоритм

сортировки также будет просматривать подмассивы, отыскивая каждый раз минимальное значение. Однако вместо обмена пар соседних значений, стоящих не в том порядке, алгоритм просто записывает индекс минимального значения и затем производит единственный обмен его со значением, которое занимает в данный момент верхнюю позицию в подмассиве. Первый проход по массиву находит, что минимальное значение, равное 1, занимает 4-й элемент. Как только это определено, элементы нулевой и четвертый обмениваются значениями. Затем выборочная сортировка сканирует все меньшие и меньшие подмассивы, аналогично пузырьковой сортировке.

 

Задание 5. Выполнить выборочную сортировку

#include <iostream.h>

#include <conio.h>

#include <vcl.h>

inline void swap(int array[], int pos1, int pos2)

{

int temp;

temp = array[pos1];

array[pos1] = array[pos2];

array[pos2] = temp;

}

inline void print(int array[], int size)

{

int i;

for (i=0; i < size; ++i) {

cout << array[i] << " ";

}

cout << endl;

}

// Get_min_index() возвращает индекс массива, соответствующий

// минимальному значению подмассива, определяемому

// left и right.

inline int get_min_index(int array[], int left, int right)

{

int min_index = left;

int i;

for (i = left; i <= right; ++i) {

if (array[i] < array[min_index]) min_index = i;

}

return min_index;

}

inline void selection_sort(int array[], int size)

{

int i;

int min_index;

for (i=0; i < size-1; ++i) {

min_index = get_min_index(array, i, size-1);

if (min_index!= i) swap(array, i, min_index);

}

}

int main()

{

int array_1[] = {7, 3, 8, 2, 1, 5, 4};

print(array_1, 7);

selection_sort(array_1, 7);

print (array_1, 7);

cout << endl;

int array_2[] = {7, 3, 8, 2, 1, 5, 4, 9, 75, -5};

print(array_2, 10);

selection_sort(array_2, 10);

print(array_2, 10);

cout << endl;

int array_3[] = {1, 2, 3};

print(array_3, 3);

selection_sort(array_3, 3);

print(array_3, 3);

cout << endl;

int array_4[] = {3, 2, 1};

print(array_4, 3);

selection_sort(array_4, 3);

print(array_4, 3);

cout << endl;

int array_5[] = {5, 2, 1, 3};

print(array_5, 4);

selection_sort(array_5, 4);

print(array_5, 4);

cout << endl;

int array_6[] = {3, 3, 3};

print(array_6, 3);

selection_sort(array_6, 3);

print(array_6, 3);

cout << endl;

getch();

return 0;

}

Список

Список (list) – это контейнер, предназначенный для оптимального выполнения частых вставок и удалений элементов.

Класс-контейнер list определён в файле заголовка <list> в пространстве имён std. Класс list реализован как двунаправленный список, в котором каждый блок содержит указатели как на предыдущий, так и на последующий блок списка. Список можно пройти, следуя по связям между блоками, реализуемых обычно с помощью указателей. Для этой же цели стандартный класс контейнера списка использует механизм, называемый итератором.

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

Задание 3. Демонстрация использование итератора для доступа к блокам в списке.

#include <vcl.h>

#include <iostream.h>

#include <conio.h>

#include <list>

using namespace std;

typedef list<int> IntegerList;

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

{

IntegerList intList; // intList определён как список целых чисел

// С помощью функции push_back в список добавляются первые 10 положительных

// чётных чисел

for (int i=1; i<=10; ++i)

intList.push_back(i*2);

 

// С помощью итератора const_iterator осуществляется доступ к каждому блоку списка

for (IntegerList::const_iterator ci = intList.begin(); // Функция begin() возвращает итератор к

ci!=intList.end(); ++ci) // к первому блоку списка

cout << *ci << " ";

getch();

return 0;

}

Класс списка обладает ещё двумя функциями – push_front() (добавить в начало) и pop_ front() (удалить первый), которые работают аналогично функциям push_back() и pop_back(). Но вместо добавления и удаления элементов в конце, они добавляют и удаляют элементы в начале списка.

Ассоциативные контейнеры

Элементы ассоциативных контейнеров представляют собой пары «ключ-значение». Зная ассоциированный со значениемключ (key), можно получить доступ к значению, которое часто называетсяотображаемым значением. Ассоциативный контейнер обеспкчивают произвольный доступ, основанный на ключевых значениях.

Стандартная библиотека С++ содержит четыре ассоциативных контейнеров: map, multimap, set и multiset.

Задание 6. Демонстрация поиска элемента с использование ассоциативного контейнера map.

#include <iostream.h>

#include <vcl.h>

#include <map>

#include <conio>

typedef std::map<int, char> mymap;

//---------------------------------------------------------------------------

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

{ mymap charMap; // для ключей1, 2, 3, 4, 5 вводим нужные значения

charMap[1]= 'A';

charMap[4]= 'D';

charMap[2]= 'B';

charMap[5]= 'E';

charMap[3]= 'C';

std::cout << "Content of map" << std::endl;

mymap::iterator iter;

for (iter = charMap.begin(); iter!= charMap.end(); iter++)

{

std::cout << (*iter).first << "-->";

std::cout << (*iter).second << std::endl;

}

mymap::iterator pos = charMap.find(4);

if (pos == charMap.end())

std::cout << "Element not found";

else std::cout << "Element found: " << (*pos).second;

getch();

return 0;

}

Отладчик

Отладчик помогает находить ошибки и также является инструментом разработки. По Run программа запускается автоматически под управлением отладчика.

Контрольная точка (КТ, breakpointer) – это маркер, который указывает отладчику приостановить выполнение программы по достижении данной точки.

 

- Выбрать КТ можно:

- нажать клавишу F5

- щёлкнуть слева от нужного оператора

(для удаления КТ те же действия)

Для вызова окна списка контрольных точек (КТ) – View/ Debug Windows/ BreakPoint

В КТ можно

- просматривать переменные через список объектов наблюдения (Watch List).

Добавлять переменные в список Watch List можно

  1. щёлкнуть на имени переменной в окне редактора кода правой кнопкой и выбрать пункт Debug/Add Watch at Cursor (Добавить объект наблюдения в позиции курсора)
  2. нажать Ctrl+ F5 – появится диалоговое окно Watch Properties по ОК объект будет добавлен в список.
  3. п. Run/Add Watch – появится диалоговое окно Watch Properties

После достижения КТ список Watch List отобразит текущие значения всех переменных, которые были в него включены. Если список закрыт, его можно вывести, выбрав в гл. меню п. View/ Debug Windows/ Watches.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: