В стандартной библиотеке есть несколько инструментов для облегчения использования стандартных библиотечных алгоритмов.
Вставки
Запись результатов в контейнер с помощью итератора подразумевает, что элементы, на которые указывает итератор, можно перезаписать. Это открывает возможность для переполнения и последующего повреждения памяти.
Также на сайте ltmigracija.lt можно узнать много интересного на тему
http://ltmigracija.lt/vid-na-zhitelstvo-v-litve.html
Что означает вообще тема вид на жительство в литве про это написано на сайте ltmigracija.lt Спасибо сайту за информацию
Рассмотрим следующий пример:
void f(vector& vi)
{
fill_n(vi.begin(), 200,7 ); // присваиваем 7 элементам
// vi[0]..[199]
}
Если вектор vi содержит меньше 200 элементов, то возникает опасность.
В заголовке стандартная библиотека предусматривает три итератора, позволяющих решить эту проблему с помощью добавления (вставки) элементов в контейнер, а не перезаписи его старых элементов. Для генерирования этих трех
итераторов вставки используются три функции.
Алгоритмы вставки
r=back inserter(c) *r=x выполняет вызов c.push back(x)
r=front inserter(c) *r=x выполняет вызов c.push front(x)
r=inserter(c,p) *r=x выполняет вызов c.insert(p,x)
Для правильной работы алгоритма inserter(c,p) необходимо, чтобы итератор p был корректным итератором для контейнера c. Естественно, каждый раз при записи очередного элемента с помощью итератора вставки контейнер увеличивается на один элемент. При записи алгоритм вставки добавляет новый элемент в последовательность с помощью функции push_back(x), c.push_front() или insert(), а не перезаписывает существующий элемент. Рассмотрим следующий пример: void g(vector& vi)
{
fill_n(back_inserter(vi), 200,7 ); // добавляет 200 семерок
// в конец vi
}
Объекты-функции
Многие стандартные алгоритмы принимают в качестве аргументов объекты- функции (или функции), чтобы уточнить способ решения задачи. Обычно эти функции используются в качестве критериев сравнения, предикатов (функций, возвращающих значения типа bool) и арифметических операций. Несколько самых общих объектов-функций описано в заголовке стандартной библиотеки.
Предикаты
p=equal to() Предикат p(x,y) означает x==y, если x и y имеют тип T
p=not equal to() Предикат p(x,y) означает x!=y, если x и y имеют тип T
p=greater() Предикат p(x,y) означает x>y, если x и y имеют тип T
p=less() Предикат p(x,y) означает x
p=greater equal() Предикат p(x,y) означает x>=y, если x и y имеют тип T
p=less equal() Предикат p(x,y) означает x<=y, если x и y имеют тип T
p=logical and() Предикат p(x,y) означает x&&y, если x и y имеют тип T
p=logical or() Предикат p(x,y) означает x||y, если x и y имеют тип T
p=logical not() Предикат p(x) означает !x, если x имеет тип T
Рассмотрим следующий пример: vector v;
// . . .
sort(v.begin(),v.end(),greater()); // сортировка v в убывающем
// порядке
Обратите внимание на то, что предикаты logical_and и logical_or всегда вычисляют оба свои аргумента (в то время как операторы && и || — нет).
Арифметические операции
f=plus() f(x,y) означает x+y, где x и y имеют тип T
f=minus() f(x,y) означает x-y, где x и y имеют тип T
f=multiplies() f(x,y) означает x*y, где x и y имеют тип T
f=divides() f(x,y) означает x/y, где x и y имеют тип T
f=modulus() f(x,y) означает, что x%y, где x и y имеют тип T
f=negate() f(x) означает -x, где x имеет тип T
Адаптеры
f=bind2nd(g,y) f(x) означает g(x,y)
f=bind1st(g,x) f(y) означает g(x,y)
f=mem fun(mf) f(p) означает p->mf()
f=mem fun ref(mf) f(r) означает r.mf()
f=not1(g) f(x) означает !g(x)
f=not2(g) f(x,y) означает !g(x,y)
Б.6.3. Класс pair
В заголовке стандартная библиотека содержит несколько вспомогательных компонентов, включая класс pair.
template struct pair {
typedef T1 first_type; typedef T2 second_type;
T1 first;
T2 second;
pair(); // конструктор по умолчанию pair(const T1& x , const T2& y );
// копирующие операции:
template pair(const pair& p
);
};
template
pair make_pair(T1 x, T2 y) { return pair(x,y); }
Функция make_pair() упрощает использование пар. Например, рассмотрим схему функции, возвращающей значение и индикатор ошибки.
pair my_fct(double d)
{
errno = 0; // очищаем индикатор ошибок в стиле языка C // выполняем много вычислений, связанных с переменной d,
// и вычисляем x error_indicator ee = errno;
errno = 0; // очищаем индикатор ошибок в стиле языка C return make_pair(x,ee);
}
Этот пример является полезной идиомой. Его можно использовать следующим образом:
pair res = my_fct(123.456); if (res.second==0) {
// используем res.first
}
1168
ОБЗОР СТАНДАРТНОЙ БИБЛИОТЕКИ
else {
// ой: ошибка
}
|