АФТИ ООП 2013-2014. Лекция II/1

АФТИ ООП 2013-2014. Лекция II/1

3749bacb748a9a39d77d007e87861559?s=128

Oleg Dashevskii

February 17, 2014
Tweet

Transcript

  1. 6.

    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);! }!
  2. 8.

    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;! ! }! ! // ...! };!
  3. 11.

    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.! };!
  4. 13.

    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;! }!
  5. 14.

    STD::MAP • Ассоциативный массив: ключ → значение. • Реализован на

    базе красно-черных деревьев. • Ключи должны быть сравниваемы.
  6. 15.

    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;! ! ! // ....! };!
  7. 16.

    map<string, int>::const_iterator it;! ! for (it = counts.begin(); it !=

    counts.end(); ++it)! ! cout << it->first << ": " << it->second << endl;!
  8. 17.

    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;! ! // ....! };!
  9. 18.

    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;! ! }! };!
  10. 19.

    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;! }!
  11. 20.

    ТОНКОСТИ СРАВНЕНИЙ 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;! ! ! // ....! };!
  12. 21.

    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;! ! ! }! };!
  13. 22.

    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 {! // .....! };! !
  14. 23.

    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);! }!
  15. 24.

    ПРОЧИЕ КЛАССЫ • set<Key> – примерный аналог map<Key, bool> •

    Аналогично c multiset<Key>. • deque<T> – double-ended queue. Оптимизирован для push_front(). • queue и stack сделаны как адаптеры.
  16. 25.

    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(); }! ! // ...! };