LEC_cpp8 (1119523), страница 2
Текст из файла (страница 2)
// выходит за пределы диапазона, возбуждается исключение out_of_range)
const_reference at (size_type n) const;
reference front (); // первый элемент вектора
const_reference front () const;
reference back (); // последний элемент вектора
const_reference back () const;
// Конструкторы и т.п.
//
// конструкторы, которые могут вызываться с одним параметром , во
// избежание случайного преобразования объявлены explicit, что означает,
// что конструктор может вызываться только явно (vector<int> v=10 - ошибка,
// попытка неявного преобразования 10 в vector<int>)
explicit vector (const A&=A()); //создается вектор нулевой длины
explicit vector (size_type n; const T& value = T(); const A& = A());
// создается вектор из n элементов со значением value (или с "нулями" типа
// Т, если второй параметр отсутствует; в этом случае конструктор
// умолчания в классе Т обязателен)
template <class I> vector (I first, I last, const A& = A()); // инициализация вектора копированием элементов из [first, last), I - итератор для чтения
vector (const vector < T, A > & obj ); // конструктор копирования
vector& operator = (const vector < T, A > & obj );
~vector();
//……
// Некоторые функции-члены класса vector
//
iterator erase (iterator i ); // удаляет элемент, на который указывает данный
// итератор. Возвращает итератор элемента, следующего за удаленным.
iterator erase (iterator st, iterator fin); // удалению подлежат все элементы
// между st и fin, но fin не удаляется. Возвращает fin.
Iterator insert ( iterator i , const Т& value = T()); // вставка некоторого
// значения value перед i. Возвращает итератор вставленного элемента).
void insert (iterator i , size_type n, const T&value); // вставка n копий
// элементов со значением value перед i.
void push_back ( const T&value ) ; // добавляет элемент в конец вектора
void pop_back () ; // удаляет последний элемент (не возвращает значение!)
size_type size() const; // выдает количество элементов вектора
bool empty () const; // возвращает истину, если вызывающий вектор пуст
void clear(); //удаляет все элементы вектора
……….
}
Пример 1. Печать элементов вектора в прямом порядке.
# include < vector >;
using namespace std;
int main () {
vector < int > V( 100,5 );
vector < int > :: const_iterator p = V.begin ();
while (p != V.end ()) {
cout << *p << ’ ’;
p++;
}
cout << endl ;
}
Или в обратном порядке :
…
vector < int > :: const_reverse_iterator q = V.rbegin ( );
while ( q != V.rend ()) {
cout << *q << ’ ’; // печать в обратном порядке //
q++;
}
cout << endl;
…
Пример 2. Формирование вектора из чисел от 0 до 9
int main () {
vector < int > V ; // вектор 0-ой длины //
int i ;
for ( i = 0 ; i < 10 ; i++ ) V.push_back (i) ;
cout << V.size () << endl ; //10
// vector <int > :: iterator p=V.begin ( ) ;
// p+=2; // p++ ; p++;
}
Контейнер список
template < class T , class A = allocator < T > > сlass list {
...........
public:
// list – имя контейнера,
// T – тип элементов, которые будут храниться в списке,
// A – распределитель памяти.
// Типы
// ……..
// Итераторы
// ……..
//
// Доступ к элементам
//
reference front (); // первый элемент списка
const_reference front () const;
reference back (); // последний элемент списка
const_reference back () const;
//
// Конструкторы и т.п.
//
explicit list (const A&=A()); //создается список нулевой длины
explicit list (size_type n; const T& value = T(); const A& = A());
// создается список из n элементов со значением value (или с "нулями" типа
// Т, если второй параметр отсутствует
template <class I> list (I first, I last, const A& = A()); // инициализация списка копированием элементов из [first, last), I - итератор для чтения
list (const list < T, A > & obj ); // конструктор копирования
list& operator = (const list < T, A > & obj );
~list();
//……
// Некоторые функции-члены класса list
//
iterator erase (iterator i ); // удаляет элемент, на который указывает данный
// итератор. Возвращает итератор элемента, следующего за удаленным.
iterator erase (iterator st, iterator fin); // удалению подлежат все элементы
// между st и fin, но fin не удаляется. Возвращает fin.
Iterator insert ( iterator i , const Т& value = T()); // вставка некоторого
// значения value перед i. Возвращает итератор вставленного элемента).
void insert (iterator i , size_type n, const T&value); // вставка n копий
// элементов со значением value перед i.
void push_back ( const T&value ) ; // добавляет элемент в конец списка
void push_front ( const T&value ) ; // добавляет элемент в начало списка
void pop_back () ; // удаляет последний элемент (не возвращает значение!)
void pop_front () ; // удаляет первый элемент списка
size_type size() const; // выдает количество элементов списка
bool empty () const; // возвращает истину, если вызывающий список пуст
void clear(); //удаляет все элементы списка
……….
}
Пример 1: написать функцию, добавляющую в конец списка вещественных чисел элемент, значение которого равно среднему арифметическому всех его элементов.
# include < iostream >
# include < list >
using namespace std;
void g (list <double> &lst) {
list < double > :: const_iterator p = lst.begin ();
double s = 0; int n;
while ( p!=lst.end ()) {
s = s+*p; n++; p++;
}
if (n != 0) lst.push_back (s/n); // lst.push_back (s/lst.size());
}
Пример 2: написать функцию, формирующую по заданному вектору целых чисел список из элементов вектора с четными значениями и распечатывающую его.
# include < iostream >
# include < vector >
# include < list >
using namespace std;
void g (vector <int> &v, list <int> &lst) {
int i;
for (i = 0; i < v.size(); i++)
if (!(v[i]%2)) lst.push_back(v[i]);
list < int > :: const_iterator p = lst.begin ();
while ( p!=lst.end ()) {
cout << *p <<endl; p++;
}
}
int main () {
vector < int > v(20); list < int > lst; int i;
for (i=0; i<20; i++) v[i] = i;
cout << "vector is created" <<endl;
g (v, lst);
return 0;
}
Пример 3: написать функцию, формирующую по заданному списку целых чисел вектор из элементов списка с четными значениями и распечатывающую его.
# include < iostream >
# include < vector >
# include < list >
using namespace std;
void g (vector <int> &v, list <int> &lst) {
list < int > :: const_iterator p = lst.begin ();
while ( p!=lst.end ()) {
if (!(*p%2)) v.push_back(*p); p++;
}
for (int i=0; i < v.size(); i++) cout << v[i] <<endl;
}
int main () {
vector < int > v(20); list < int > lst;
for (i=0; i<20; i++) lst.push_back(i);
cout << "list is created" <<endl;
g (v, lst);
return 0;
}
Понятно, что написать класс-контейнер стоит большого труда.
Достоинства и недостатки STL-подхода: