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];