set
set можно изобразить следующим образом:Например, контейнер set
Чем полезны контейнеры 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. Итераторы потоков