Содержимого контейнера

В файле находится произвольное количество целых чисел. Вывести их на экран в порядке возрастания.

Сортировка вектора

Iterator last) позициями first и last

Итератор position

InputIter first, InputIter last) с позиции position

Void insert(iterator position, итераторами first и last, начиная

Позиции position

Значением value, начиная с

Позицию, заданную итератором position

insert(iterator position,size_type n, const T& value) Вставка n элементов со

template <class InputIter>Вставка диапазона элементов, заданного

erase(iterator position)Удаление элемента, на который указывает

erase(iterator first, Удаление диапазона элементов, заданного

Программа считывает числа в вектор, сортирует по возрастанию и выводит на экран:

#include <iostream>

#include <fstream>

#include <vector>

#include <algorithm>

using namespace std;

int main() {

ifstream in ("inpnum.txt");

if (!in) { cerr «"File not found\n"; exit(1); }

vector<int> v;

int x;

while (in >> x) v.push_back(x);

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

vector<int>::const_iterator i;

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

cout << *i << " ";

return 0;

}

В данном примере вместо вектора можно было использовать любой последовательный контейнер путем простой замены слова vector на deque или list. При этом изменилось бы внутреннее представление данных, но результат работы программы остался бы таким же.

Приведем еще один пример работы с векторами, демонстрирующий использование методов swap(), empty(), back(), pop_back():

#include <iostream>

#include <vector>

using namespace std:

int mainO {

double arr[] = {1.1, 2.2, 3.3, 4.4 };

int n = sizeof(arr)/sizeof(double):

// Инициализация вектора массивом

vector<double> v1(arr, arr + n);

vector<double> v2; // пустой вектор

vl.swap(v2); // обменять содержимое vl и v2

while (!v2.empty()) {

cout << v2.back() << ' '; // вывести последний элемент

v2.pop_back(); // и удалить его

}

return 0:

}

Результат выполнения программы:

4.4 3.3 2.2 1.1

Шаблонная функция print() для вывода

В процессе работы над программами, использующими контейнеры, часто приходится выводить на экран их текущее содержимое. Приведем шаблон функции, решающей эту задачу для любого типа (T) контейнера:

template <class Т> void print(T& cont) {

typename T::const_iterator p = cont.begin();

if (cont.empty())

cout << "Container is empty.";

for (p; p!= cont.end(); ++p)

cout << *p << ' ';

cout << endl;

}

Обратите внимание на служебное слово typename, с которого начинается объявление итератора р. Дело в том, что библиотека STL «знает», что Т::iterator — это некоторый тип, а компилятор C++ таким знанием не обладает. Поэтому без typenameнормальные компиляторы фиксируют ошибку.

Теперь можно пользоваться функцией print (), включая ее определение в исходный файл с программой, как, например, в следующем эксперименте с очередью:

#include <iostream>

#include <deque>

using namespace std;

/*... определение функции print... */

int main() {

deque<int> dec; print(dec); // Container is empty

dec.push_back(4): print(dec); //4

dec.push_front(3); print(dec); / / 3 4

dec.push_back(5); print(dec); / / 3 45

dec.push_front(2); print(dec); / / 2 3 4 5

dec.push_back(6); print(dec); / / 2 3 4 5 6

dec.push_front(1); print(dec); / / 1 2 3 4 5 6

return 0;

}

К сожалению, инициализация двусторонней очереди не поддерживаетсядиапазоном элементов контейнера другого типа, то есть определение: deque<int> dec(v1.beg(), v1.end()) не верно.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: