Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

v.push_back(2.7); // добавляем в конец вектора v элемент

// со значением 2.7

// теперь вектор v содержит один элемент

// и v[0]==2.7

v.push_back(5.6); // добавляем в конец вектора v элемент

//
со значением 5.6

// теперь вектор v содержит два элемента

// и v[1]==5.6

v.push_back(7.9); // добавляем в конец вектора v элемент

// со значением 7.9

// теперь вектор v содержит три элемента

// и v[2]==7.9

Обратите внимание на синтаксис вызова функции

push_back
. Он называется вызовом функции-члена; функция
push_back
является функцией-членом объекта типа
vector
, и поэтому для ее вызова используется особая форма вызова.

вызов функции-члена:

имя_объекта.имя_функции_члена(список_аргументов)

Размер вектора можно определить, вызвав другую функцию-член объекта типа

vector: size
. В начальный момент значение
v.size
равно 0, а после третьего вызова функции
push_back
значение
v.size
равно
3
. Зная размер вектора, легко выполнить цикл по всем элементам вектора. Рассмотрим пример.

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

cout << "v[" << i << "]==" << v[i] << '\n';

Этот цикл выводит на экран следующие строки:

v[0]==2.7

v[1]==5.6

v[2]==7.9

Если вы имеете опыт программирования, то можете заметить, что тип

vector
похож на массив в языке С и других языках. Однако вам нет необходимости заранее указывать размер (длину) вектора, и вы можете добавлять в него элементы по мере необходимости. В дальнейшем мы убедимся, что тип
vector
из стандартной библиотеки С++ обладает и другими полезными свойствами.

4.6.2. Числовой пример

Рассмотрим более реалистичный пример. Часто нам требуется считать коллекцию данных в программу и что-то с ними сделать. Это “что-то” может означать построение графика, вычисление среднего и медианы, сортировку, смешивание с другими данными, поиск интересующих нас значений, сравнение с другими данными и т.п. Перечислять операции с данными можно бесконечно, но сначала данные необходимо считать в память компьютера. Рассмотрим основной способ ввода неизвестного — возможно, большого — объема данных. В качестве конкретного примера попробуем считать числа с плавающей точкой, представляющие собой значения температуры.

// считываем значения температуры в вектор

int main

{

vector<double> temps; // значения температуры

double temp;

while (cin>>temp) //
считываем

temps.push_back(temp); // записываем в вектор

// ...что-то делаем...

}

Итак, что происходит в этом фрагменте программы? Сначала мы объявляем вектор для хранения данных и переменную, в которую будет считываться каждое следующее входное значение.

vector<double> temps; // значения температуры

double temp;

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

double
.

Теперь выполняется цикл считывания.

while (cin>>temp) // считываем

temps.push_back(temp); // записываем в вектор

Инструкция

cin>>temp
считывает число типа
double
, а затем это число “заталкивается” в вектор (записывается в конец вектора). Эти операции уже были продемонстрированы выше. Новизна здесь заключается в том, что в качестве условия выхода из цикла
while
мы используем операцию ввода
cin>>temp
. В основном условие
cin>>temp
является истинным, если значение считано корректно, в противном случае оно является ложным. Таким образом, в цикле
while
считываются все числа типа
double
, пока на вход не поступит нечто иное. Например, если мы подадим на вход следующие данные

1.2 3.4 5.6 7.8 9.0 |

то в вектор

temps
будут занесены пять элементов:
1.2
,
3.4
,
5.6
,
7.8
,
9.0
(именно в таком порядке, т.е.
temps[0]==1.2
). Для прекращения ввода используется символ
|
, т.е. значение, не имеющее тип
double
. В разделе 10.6 мы обсудим способы прекращения ввода и способы обработки ошибок ввода.

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

// вычисляем среднее и медиану значений температур

int main

{

vector<double> temps; // значения температур

double temp;

while (cin>>temp) // считываем данные

temps.push_back(temp); // заносим их в вектор

// вычисляем среднюю температуру:

double sum = 0;

for (int i = 0; i < temps.size; ++i) sum += temps[i];

cout << "Average temperature: " << sum/temps.size << endl;

// вычисляем медиану температуры:

sort(temps.begin,temps.end); // сортируем значения

// температуры

// "от начала до конца"

cout << "Медиана температуры: " << temps[temps.size/2] << endl;

}

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

temps.size
).

Поделиться:
Популярные книги

На распутье

Кронос Александр
2. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На распутье

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

Гром над Академией Часть 3

Машуков Тимур
4. Гром над миром
Фантастика:
фэнтези
5.25
рейтинг книги
Гром над Академией Часть 3

Попаданка в Измену или замуж за дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Попаданка в Измену или замуж за дракона

Проданная невеста

Wolf Lita
Любовные романы:
любовно-фантастические романы
5.80
рейтинг книги
Проданная невеста

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Уязвимость

Рам Янка
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Уязвимость

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Безумный Макс. Ротмистр Империи

Ланцов Михаил Алексеевич
2. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
4.67
рейтинг книги
Безумный Макс. Ротмистр Империи

Наследница Драконов

Суббота Светлана
2. Наследница Драконов
Любовные романы:
современные любовные романы
любовно-фантастические романы
6.81
рейтинг книги
Наследница Драконов

Вечный. Книга III

Рокотов Алексей
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга III

Дурашка в столичной академии

Свободина Виктория
Фантастика:
фэнтези
7.80
рейтинг книги
Дурашка в столичной академии