Чем полезны контейнеры set
struct Fruit {
string name;
int count;
double unit_price;
Date last_sale_date;
// ...
};
struct Fruit_order
{
bool operator(const Fruit& a, const Fruit& b) const
{
return a.name
}
};
set
// Fruit_Order для сравнения
// объектов класса Fruit
Здесь мы снова видим, что объект-функция значительно расширяет спектр задач, которые удобно решать с помощью компонентов библиотеки STL.
set
operator[]
). Следовательно, вместо нее мы должны использовать “операции над списками”, такие как insert
и erase
. К сожалению, контейнеры map
и set
не поддерживают функцию push_back
по очевидной причине: место вставки нового элемента определяет контейнер set
, а не программист.Вместо этого следует использовать функцию insert
inventory.insert(Fruit("quince",5));
inventory.insert(Fruit("apple", 200, 0.37));
Одно из преимуществ контейнера set
map
заключается в том, что мы можем непосредственно использовать значение, полученное от итератора. Поскольку в контейнере set
нет пар (ключ, значение), как в контейнере map
(см. раздел 21.6.3), оператор разыменования возвращает значение элемента.typedef set
for (SI p = inventory.begin,p!=inventory.end; ++p)
cout << *p
<< '\n';
Разумеется, этот фрагмент работает, только если вы определили оператор <<
Fruit
.21.7. Копирование
В разделе 21.2 мы назвали функцию find
copy
даст алгоритму find
фору. В библиотеке STL есть три варианта алгоритма copy
.21.7.1. Алгоритм copy
Основная версия алгоритма copy
template
{
while (first!=last) {
*res = *first; // копирует элемент
++res;
++first;
}
return res;
}
Получив пару итераторов, алгоритм copy
void f(vector
// копирует элементы списка чисел типа int в вектор чисел типа
// double
{
if (vd.size < li.size) error("целевой контейнер слишком мал");
copy(li.begin, li.end, vd.begin);
// ...
}
Обратите внимание на то, что тип входной последовательности может отличаться от типа результирующей последовательности. Это обстоятельство повышает универсальность алгоритмов из библиотеки STL: они работают со всеми видами последовательностей, не делая лишних предположений об их реализации. Мы не забыли проверить, достаточно ли места в результирующей последовательности для записи вводимых элементов. Такая проверка входит в обязанности программиста. Алгоритмы из библиотеки STL программировались для достижения максимальной универсальности и оптимальной производительности; по умолчанию они не проверяют диапазоны и не выполняют других тестов, защищающих пользователей. Каждый раз, когда это требуется, пользователь должен сам выполнить такую проверку.
21.7.2. Итераторы потоков
copy
Напомним свойства последовательностей.
• Последовательность имеет начало и конец.
• Переход на следующий элемент последовательности осуществляется с помощью оператора ++