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
Case Studies and Future Research - Lecture 12 - Next Generation User Interfaces (4018166FNR)
signer
PRO
0
200
[2026前期火5] 論理学(京都大学文学部 前期 第2回)「論理的な正しさはどこにあるのか」
yatabe
0
1k
Lectura 2 (PIT : Python Basico)
robintux
0
370
AI時代に、 なぜ英語を勉強するのか
empelt
0
120
!コスパよくインターンに受かる方法!
ruribou
1
290
輻射安全管理系統2.0暨輻防e++學園平台說明會
aecrp
0
1.4k
0526
cbtlibrary
0
190
2026年度春学期 統計学 第7回 データの関係を知る(2)ー 回帰と決定係数 (2026. 5. 21)
akiraasano
PRO
0
180
Implicit and Cross-Device Interaction - Lecture 10 - Next Generation User Interfaces (4018166FNR)
signer
PRO
2
2.3k
2026年度春学期 統計学 第11回 分布の「型」を考える - 確率分布モデルと正規分布 (2026. 6. 11)
akiraasano
PRO
0
110
[2026前期火5] 論理学(京都大学文学部 前期 第1回)「ハルシネーションを外部世界との対応を考えずに見分ける方法」
yatabe
0
1.2k
Public Space Is Not For Sale
drikkes
0
120
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
260
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
Are puppies a ranking factor?
jonoalderson
1
3.7k
New Earth Scene 8
popppiees
3
2.4k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
1.9k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Building Adaptive Systems
keathley
44
3.1k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
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(); }! ! // ...! };