Содержание
- 2. Итераторы — это клей, скрепляющий алгоритмы стандартной библиотеки с их данными. Итераторы можно также назвать механизмом,
- 3. Для того чтобы считать последовательность, алгоритм обычно получает пару итераторов [a,b) и перемещается по элементам с
- 4. Алгоритмы, записывающие элементы последовательности, часто получают только итератор, установленный на ее первый элемент. template void f
- 5. #include advance · back_insert_iterator · back_inserter · bidirectional_iterator_tag · distance · forward_iterator_tag · front_insert_iterator · front_inserter
- 6. Операции над итераторами ++р Префиксная инкрементация: устанавливает итератор р на следующий элемент последовательности или на элемент,
- 7. р != q Неравенство: ! (p==q) p p p>q Указывает ли итератор p на элемент, расположенный
- 8. Итераторы ввода и вывода являются наиболее ограниченными типами итераторов: они могут выполнять последовательные однопроходные операции ввода
- 9. input iterator - Можем перемещаться вперед с помощью оператора ++ и считывать каждый элемент только один
- 10. template struct iterator { typedef C iterator_category; typedef T value_type; typedef Dist distance_type; }; Категории итераторов
- 11. Примеры реализаций #define _STRING_ITERATOR(ptr) iterator(ptr, this) iterator begin() { // return iterator for beginning of mutable
- 12. Итераторы можно определять отдельными переменными, а можно использовать анонимные непосредственно в качестве аргументов при вызове. vector
- 13. Вспомогательные функции для итераторов Для большего удобства при работе с итераторами в библиотеке реализованы две вспомогательные
- 14. Примеры: advance #include #include #include using namespace std; int main () { vector v; for (int
- 15. Примеры: distance #include #include #include using namespace std; int main () { vector v; for (int
- 16. Примеры: begin и end #include #include using namespace std; int main () { int foo[ ]
- 17. iterator_traits #include #include #include int main() { typedef std::iterator_traits traits; if ( typeid (traits::iterator_category) == typeid
- 18. std::prev #include // std::cout #include // std::next #include // std::list #include // std::for_each int main ()
- 19. std::next #include // std::cout #include // std::next #include // std::list #include // std::for_each int main ()
- 20. iterator_traits #include #include #include #include using namespace std; template void function( it i1, it i2 )
- 21. int main( ) { vector vc( 10,'a' ); list li( 10 ); function( vc.begin( ), vc.end(
- 22. Создаем свой итератор #include #include class MyIterator : public std::iterator { int* p; public: MyIterator(int* x)
- 23. Распределители памяти Три стратегии управления памятью в С++: 1. Распределение общего назначения, или универсальное распределение может
- 24. На практике мы часто сталкиваемся с комбинацией этих стратегий. Например, возможно, ваш диспетчер памяти использует схему
- 25. Выбор стратегии В чем состоит отличие различных уровней управления памятью в контексте STL и типичных средах,
- 26. Распределитель по умолчанию (The default allocator) template class allocator { public: typedef T* pointer; typedef const
- 27. Пример создания аллокатора (взято на stackoverflow.com) #include #include #include #include class Arena { public: Arena() {
- 28. auto mem = m_memory; m_available -= n; m_memory += n; ++m_allocations; return mem; } void deallocate(void*
- 29. Предполагается, что контейнеры обязаны обращаться к аллокатору не напрямую, а через шаблон std::allocator_traits, который предоставляет значения
- 30. template struct ArenaAllocator { using value_type = T; using Traits = std::allocator_traits >; explicit ArenaAllocator(Arena& arena)
- 31. Операторы сравнения: template bool operator==(const ArenaAllocator & lhs, const ArenaAllocator & rhs) { return lhs.m_arena ==
- 32. // применение с разными контейнерами #include #include #include #include #include #include #include #include #include #include using
- 33. template using a_set = std::set , ArenaAllocator >; template using a_map = std::map , ArenaAllocator >>;
- 34. int main() { Arena arena; ArenaAllocator arena_allocator( arena); a_string s_empty (arena_allocator); a_string s_123("123", arena_allocator); a_vector v_int
- 35. Виртуализация функций – не членов класса. По книги С. Мейерса «Наиболее эффективное использование С++» (пр. 25)
- 36. class NewsLetter {// газета: текст и иллюстрации public: NewsLetter (istream& str){ while (str) { // Добавить
- 37. error LNK2001: unresolved external symbol "public: virtual class std::basic_ostream > & __thiscall TextBlock::operator > &)const "
- 38. Альтернативный подход - объявить виртуальную функцию для вывода (например, функцию print) и определить ее в классах
- 39. class NLComponent { public: virtual ostream& print(ostream& s) const = 0; }; class TextBlock: public NLComponent
- 40. Домашнее задание на неделю Проект 33. С любого сайта (например - новостного) взять текст (три-четыре абзаца)
- 42. Скачать презентацию