Программирование. Принципы и практика использования C++ Исправленное издание, стр. 298
Вместо этого следует использовать функцию
insert()inventory.insert(Fruit("quince",5));inventory.insert(Fruit("apple", 200, 0.37));Одно из преимуществ контейнера
setmapsetmaptypedef set<Fruit>::const_iterator SI;for (SI p = inventory.begin(),p!=inventory.end(); ++p) cout << *p << '\n';Разумеется, этот фрагмент работает, только если вы определили оператор
<<Fruit21.7. Копирование
В разделе 21.2 мы назвали функцию
find()copy()find()copy()
21.7.1. Алгоритм copy()
Основная версия алгоритма
copy()template<class In, class Out> Out copy(In first, In last, Out res){ while (first!=last) { *res = *first; // копирует элемент ++res; ++first; } return res;}Получив пару итераторов, алгоритм
copy()void f(vector<double>& vd, list<int>& li) // копирует элементы списка чисел типа int в вектор чисел типа // double{ if (vd.size() < li.size()) error("целевой контейнер слишком мал"); copy(li.begin(), li.end(), vd.begin()); // ...}Обратите внимание на то, что тип входной последовательности может отличаться от типа результирующей последовательности. Это обстоятельство повышает универсальность алгоритмов из библиотеки STL: они работают со всеми видами последовательностей, не делая лишних предположений об их реализации. Мы не забыли проверить, достаточно ли места в результирующей последовательности для записи вводимых элементов. Такая проверка входит в обязанности программиста. Алгоритмы из библиотеки STL программировались для достижения максимальной универсальности и оптимальной производительности; по умолчанию они не проверяют диапазоны и не выполняют других тестов, защищающих пользователей. Каждый раз, когда это требуется, пользователь должен сам выполнить такую проверку.
21.7.2. Итераторы потоков
copy()Напомним свойства последовательностей.
• Последовательность имеет начало и конец.
• Переход на следующий элемент последовательности осуществляется с помощью оператора
++• Значение элемента последовательности можно найти с помощью оператора
*Потоки ввода и вывода можно легко описать точно так же. Рассмотрим пример.
ostream_iterator<string> oo(cout); // связываем поток *oo с потоком // cout для записи*oo = "Hello, "; // т.е. cout << "Hello, "++oo; // "готов к выводу следующего // элемента"*oo = "World!\n"; // т.е. cout << "World!\n"В стандартной библиотеке есть тип
ostream_iteratorostream_iterator<T>TВ стандартной библиотеке есть также тип
istream_iterator<T>Tistream_iterator<string> ii(cin); // чтение *ii — это чтение строки // из cinstring s1 = *ii; // т.е. cin>>s1++ii; // "готов к вводу следующего // элемента"string s2 = *ii; // т.е. cin>>s2Используя итераторы
ostream_iteratoristream_iteratorcopy()