Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
АФТИ ООП 2013-2014. Лекция II/1
Search
Oleg Dashevskii
February 17, 2014
Education
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
АФТИ ООП 2013-2014. Лекция II/1
Oleg Dashevskii
February 17, 2014
More Decks by Oleg Dashevskii
See All by Oleg Dashevskii
Лекция № 13. Практическое руководство по разработке
be9
0
1.6k
Лекция № 12. Ещё о проектировании
be9
0
1.5k
Лекция № 11. Принцип отделения интерфейса. «Малое ООП»
be9
0
1.6k
Лекция № 10. Графическая нотация. Принципы LSP и DIP
be9
0
1.6k
Лекция № 9. Отношения между классами. Принцип открытия-закрытия
be9
0
1.5k
Лекция № 8. Хорошие и плохие ОО-программы
be9
0
1.5k
Лекция № 7. algorithm. Исключения
be9
1
1.5k
Лекция № 6. Стандартная библиотека C++. Часть 2
be9
0
1.6k
Лекция № 5. Стандартная библиотека C++. Часть 1
be9
0
1.6k
Other Decks in Education
See All in Education
Portable & Reproducible Research Environments in the Age of AI Agents
denkiwakame
0
620
Catecismo 26 #1 - Aula inaugural
cm_manaus
0
230
Beyond the Prompt: Programming as a Pathway to Statistical Thinking
minecr
0
310
AIには考えられないことを考えられる人になるために
iqbocchi
1
220
遊ぶかね欲しさの犯行(ルビ:労働)です
shirayanagiryuji
0
220
NDIAS Automotive / IoT CTF 2026 Recap - Keyfob & OSINT
himitu23
0
290
0506
cbtlibrary
0
240
2026年度春学期 統計学 第14回 分布についての仮説を検証する ― 仮説検定(1) (2026. 7. 2)
akiraasano
PRO
0
130
吉祥寺.pmは1つじゃない — 複数イベント並走運営の12年 —
magnolia
0
1.4k
Enterprise UI, v2
stevekinney
0
150
【デザイナー就活講座】 デザイナー就活市場・企業探し・ポートフォリオのポイント
koheihasebe
0
410
Geografía y Fútbol: Chattanooga Geografía del Búnker de La Roja.
juanmartin2026
1
12k
Featured
See All Featured
A designer walks into a library…
pauljervisheath
211
24k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
270
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
340
Crafting Experiences
bethany
1
250
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
56k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Un-Boring Meetings
codingconduct
0
380
A Soul's Torment
seathinner
6
3.4k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
430
The SEO identity crisis: Don't let AI make you average
varn
0
530
Transcript
ОБЪЕКТНО- ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ Лекция № 2/1 17.02.2014 г.
СТАНДАРТНЫЕ КОНТЕЙНЕРЫ • Готовые, протестированные, эффективные, настраиваемые реализации распространенных структур
данных уже есть. • «Вы просто не умеете их готовить».
АТРИБУТЫ КОНТЕЙНЕРОВ • Линейность/нелинейность • Произвольный доступ • Упорядоченность •
«Специфичность»
ОПЕРАЦИИ • Вставка • Удаление • Поиск по ключу •
Доступ по индексу • Обход
STD::VECTOR • Динамический массив. • Оптимизирован для вставки. std::vector<int> numbers;!
! for (int i = 0; i < 100000; ++i)! ! numbers.push_back(i);
void push_back(const value_type& __x)! {! if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)! {!
this->_M_impl.construct(this->_M_impl._M_finish, __x);! ! ++this->_M_impl._M_finish;! }! else! _M_insert_aux(end(), __x);! }!
vector<int>::const_iterator it;! ! for (it = numbers.begin(); it != numbers.end();
++it)! ! cout << *it << ' ';!
template<typename _Iterator, typename _Container>! class __normal_iterator {! protected:! ! _Iterator
_M_current;! ! public:! ! // ...! ! typedef typename iterator_traits<_Iterator>::reference reference;! ! typedef typename iterator_traits<_Iterator>::pointer pointer;! ! ! __normal_iterator() : _M_current(_Iterator()) { }! ! ! reference operator*() const { return *_M_current; }! ! pointer operator->() const { return _M_current; }! ! ! __normal_iterator& operator++() {! ! ! ++_M_current; ! ! ! return *this;! ! }! ! // ...! };!
vector<vector<double> > matrix;
STD::LIST • Двусвязный (кольцевой) список
struct _List_node_base {! ! _List_node_base* _M_next; ///< Self-explanatory! ! _List_node_base*
_M_prev; ///< Self-explanatory! ! ! // ....! };! ! template<typename _Tp>! struct _List_node : public _List_node_base {! ! _Tp _M_data; ///< User's data.! };!
list<int>::const_iterator it;! ! for (it = numbers.begin(); it != numbers.end();
++it)! ! cout << *it << ' ';! vector<int>
template<typename _Tp>! struct _List_iterator! {! ! typedef _List_iterator<_Tp> _Self;! !
typedef _List_node<_Tp> _Node;! ! ! typedef _Tp* pointer;! ! typedef _Tp& reference;! ! ! _List_iterator() : _M_node() { }! ! ! explicit _List_iterator(_List_node_base* __x) : _M_node(__x) { }! ! ! // Must downcast from List_node_base to _List_node to get to _M_data.! ! reference operator*() const { return static_cast<_Node*>(_M_node)->_M_data; }! ! ! pointer operator->() const { return &static_cast<_Node*>(_M_node)->_M_data; }! ! ! _Self& operator++() {! ! ! _M_node = _M_node->_M_next;! ! ! return *this;! ! }! ! ! _List_node_base* _M_node;! }!
STD::MAP • Ассоциативный массив: ключ → значение. • Реализован на
базе красно-черных деревьев. • Ключи должны быть сравниваемы.
std::map<std::string, int> count_words() ! {! ! std::string word;! ! std::map<std::string,
int> counts;! ! ! while (word = get_word(), !word.empty()) {! ! ! std::map<std::string, int>::iterator it = counts.find(word);! ! ! ! if (it == counts.end())! ! ! ! counts[word] = 1;! ! ! else! ! ! ! ++it->second;! ! ! }! ! ! return counts;! }! template<class _T1, class _T2>! struct pair {! ! typedef _T1 first_type;! ! typedef _T2 second_type;! ! ! _T1 first;! ! _T2 second;! ! ! // ....! };!
map<string, int>::const_iterator it;! ! for (it = counts.begin(); it !=
counts.end(); ++it)! ! cout << it->first << ": " << it->second << endl;!
enum _Rb_tree_color { _S_red = false, _S_black = true };!
! struct _Rb_tree_node_base {! typedef _Rb_tree_node_base* _Base_ptr;! ! _Rb_tree_color _M_color;! _Base_ptr _M_parent;! _Base_ptr _M_left;! _Base_ptr _M_right;! ! // ....! };!
template<typename _Tp>! struct _Rb_tree_iterator {! ! typedef _Tp value_type;! !
typedef _Tp& reference;! ! typedef _Tp* pointer;! ! typedef _Rb_tree_iterator<_Tp> ! _Self;! ! typedef _Rb_tree_node<_Tp>* _Link_type; ! ! ! reference operator*() const { ! ! ! return static_cast<_Link_type>(_M_node)->_M_value_field;! ! }! ! ! _Self operator++(int) {! ! ! _Self __tmp = *this;! ! ! _M_node = _Rb_tree_increment(_M_node);! return __tmp;! ! }! };!
static _Rb_tree_node_base *local_Rb_tree_increment(_Rb_tree_node_base* __x) {! ! if (__x->_M_right != 0)
{! ! ! __x = __x->_M_right;! ! ! while (__x->_M_left != 0)! __x = __x->_M_left;! ! } else {! _Rb_tree_node_base* __y = __x->_M_parent;! while (__x == __y->_M_right) {! __x = __y;! __y = __y->_M_parent;! ! ! }! if (__x->_M_right != __y)! __x = __y;! }! return __x;! }!
ТОНКОСТИ СРАВНЕНИЙ template <typename _Key, typename _Tp, ! typename _Compare
= std::less<_Key>,! typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >! class map {! public:! ! typedef _Key key_type;! ! typedef _Tp mapped_type;! ! typedef std::pair<const _Key, _Tp> value_type;! ! typedef _Compare key_compare;! ! typedef _Alloc allocator_type;! ! ! // ....! };!
template <class _Arg1, class _Arg2, class _Result>! struct binary_function! {!
! typedef _Arg1 first_argument_type;! ! typedef _Arg2 second_argument_type;! ! typedef _Result result_type;! };! ! template <class _Tp>! struct less : public binary_function<_Tp, _Tp, bool> {! ! bool operator()(const _Tp& __x, const _Tp& __y) const {! ! ! return __x < __y;! ! ! }! };!
struct Address {! string city, details, postal_index;! ! Address(const string
&_city, const string &_details = string(),! const string _index = string())! : city(_city), details(_details), postal_index(_index) {}! };! ! struct Person {! // .....! };! !
struct CityCompare {! bool operator()(const Address &a1, const Address &a2)
const {! return a1.city < a2.city;! }! };! ! void add_karma_to_novosibirsk_people(! vector<pair<Address, Person> > people_and_addresses) {! typedef multimap<Address, Person, CityCompare> AdrMap;! ! AdrMap addresses_by_city;! ! for (int i = 0; i < people_and_addresses.size(); ++i)! addresses_by_city.insert(people_and_addresses[i]);! ! pair<AdrMap::const_iterator, AdrMap::const_iterator> nsk_range =! addresses_by_city.equal_range(Address("Novosibirsk"));! ! // Yay, Novosibirsk people!!! for (AdrMap::const_iterator it = nsk_range.first;! it != nsk_range.second; ++it)! !add_karma(it->second, 100);! }!
ПРОЧИЕ КЛАССЫ • set<Key> – примерный аналог map<Key, bool> •
Аналогично c multiset<Key>. • deque<T> – double-ended queue. Оптимизирован для push_front(). • queue и stack сделаны как адаптеры.
template<typename _Tp, typename _Sequence = deque<_Tp> >! class stack {!
protected:! _Sequence c;! ! public:! typedef typename _Sequence::reference reference;! ! bool empty() const { return c.empty(); }! size_type size() const { return c.size(); }! ! reference top() { return c.back(); }! void push(const value_type& __x) { c.push_back(__x); }! void pop() { c.pop_back(); }! ! // ...! };