Программирование. Принципы и практика использования C++ Исправленное издание, стр. 276
{ list<int> lst; int x; while (cin >> x) lst.push_front(x); list<int>::iterator p = high(lst.begin(), lst.end()); cout << "Максимальное значение = " << *p << endl;}Здесь значением аргумента класса
Iteratorlist<int>::iterator++*!=high()listpush_front()push_back()vectorПОПРОБУЙТЕ
В стандартном классе
vectorpush_front()push_front()vectorpush_back()Итак, настало время спросить: “А что, если объект класса
listlst.begin()==lst.end()*plst.end()
begin()end()
Существует важная причина, по которой итератор
endВ нашем примере можно поступить следующим образом:
list<int>::iterator p = high(lst.begin(), lst.end());if (p==lst.end()) // мы достигли конца? cout << "Список пустой";else cout << "максимальное значение = " << *p << endl;Работая с алгоритмами из библиотеки STL, мы систематически используем эту проверку. Поскольку в стандартной библиотеке список предусмотрен, не будем углубляться в детали его реализации. Вместо этого кратко укажем, чем эти списки удобны (если вас интересуют детали реализации списков, выполните упр. 12–14).
20.5. Еще одно обобщение класса vector
Из примеров, приведенных в разделах 20.3 и 20.4, следует, что стандартный вектор имеет член класса, являющийся классом
iteratorbegin()end()std::listvectortemplate<class T> class vector {public: typedef unsigned long size_type; typedef T value_type; typedef T* iterator; typedef const T* const_iterator; // ... iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; size_type size(); // ...};
typedefvectoriteratorT*vvectorvector<int>::iterator p = find(v.begin(), v.end(),32);и
for (vector<int>::size_type i = 0; i<v.size(); ++i) cout << v[i] << '\n';Дело в том, что, для того, чтобы написать эти инструкции, нам на самом деле не обязательно знать, какие именно типы называются
iteratorsize_typesize_typesize_typeunsigned longiterator