Форум программистов, компьютерный форум CyberForum.ru

Можно ли узнать размер одного элемента в STL контейнере? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Отключение клавиатуры, а именно комбинаций CTRL+ALT+DEL\WIN+L http://www.cyberforum.ru/cpp-beginners/thread555280.html
Здравствуйте, пишу программку, стала задача заблокировать на некоторое время комбинации клавиш CTRL+ALT+DEL\WIN+L. Пробовал посылать SHIFT при нажатии одной кнопки из комбинации, не помогло (хотя если просто попробовать нажать CTRL+ALT+DEL+SHIFT - ничего и не произойдет!). Остальные идеи, которые я видел, работают под Win9x, но не под Win7 На данный момент все реализуется при помощи...
C++ Автосерф web страницы Привет парни помогите мне нужна прога которая будет открывать web страницу парсируя её директории через 2-сек вот пример вот так www.rghost.ru/5452342 /5654675 /6565656 /6546546 а именно чтоб я мог положить txt фаил с директориями и поехали! http://www.cyberforum.ru/cpp-beginners/thread552448.html
Посчитать количество отрицательных элементов C++
Помогите пожалуйста составить программный код для 2 задач 1)Дан одномерный массив.Посчитать количество отрицательных элементов. 2)Дам массив 4х4 состоящий из символов.Посчитать количество символов <?>расположенных на главной диагонали. Добавлено через 12 минут #include <stdio.h> #include <conio.h> int main() { const int N=5;
C++ Как перекодировать wav во flac или speex
как перекодировать wav во flac или speex? или сразу записать в нужный формат? подскажите пожалуйста
C++ Алгоритм для деревьев http://www.cyberforum.ru/cpp-beginners/thread546421.html
Всем привет! Препод дал задание написать программу, которая бы находила максимальное независимое множество в дереве(т.е. дано дерево, надо найти максимальное множество вершин, никакие две из которых не связаны ребром) Нашел на псевдокод function get_independent_set(Node u) { если I(u) уже посчитано, то возвратить I(u) //мощность множества, которое можно получить, если...
C++ Господа, подскажите исходники компилятора для С++ написанного на С++ Господа, подскажите исходники компилятора для С++ написанного на С++. Главное чтобы была корректная поддержка WinAPI и OpenGL Добавлено через 2 минуты ну и разумеется чтобы компоновщик также был, в общем чтобы exe получал на выходе подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.04.2012, 08:49     Можно ли узнать размер одного элемента в STL контейнере?
fasked, Одного элемента. Не всего контейнера а одного элемента в контейнере. Причем не value_type-а, а по внутренней реализации. Допустим для списка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    struct _List_node_base
    {
      _List_node_base* _M_next;
      _List_node_base* _M_prev;
      
      static void
      swap(_List_node_base& __x, _List_node_base& __y) throw ();
      
      void
      _M_transfer(_List_node_base* const __first,
          _List_node_base* const __last) throw ();
      
      void
      _M_reverse() throw ();
      
      void
      _M_hook(_List_node_base* const __position) throw ();
      
      void
      _M_unhook() throw ();
    };
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  /// An actual node in the %list.
  template<typename _Tp>
    struct _List_node : public __detail::_List_node_base
    {
      ///< User's data.
      _Tp _M_data;
 
#ifdef __GXX_EXPERIMENTAL_CXX0X__
      template<typename... _Args>
        _List_node(_Args&&... __args)
    : __detail::_List_node_base(), _M_data(std::forward<_Args>(__args)...) 
        { }
#endif
    };
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  /// See bits/stl_deque.h's _Deque_base for an explanation.
  template<typename _Tp, typename _Alloc>
    class _List_base
    {
    protected:
      // NOTA BENE
      // The stored instance is not actually of "allocator_type"'s
      // type.  Instead we rebind the type to
      // Allocator<List_node<Tp>>, which according to [20.1.5]/4
      // should probably be the same.  List_node<Tp> is not the same
      // size as Tp (it's two pointers larger), and specializations on
      // Tp may go unused because List_node<Tp> is being bound
      // instead.
      //
      // We put this to the test in the constructors and in
      // get_allocator, where we use conversions between
      // allocator_type and _Node_alloc_type. The conversion is
      // required by table 32 in [20.1.5].
      typedef typename _Alloc::template rebind<_List_node<_Tp> >::other
        _Node_alloc_type;
 
      typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
 
      struct _List_impl 
      : public _Node_alloc_type
      {
    __detail::_List_node_base _M_node;
 
    _List_impl()
    : _Node_alloc_type(), _M_node()
    { }
 
    _List_impl(const _Node_alloc_type& __a)
    : _Node_alloc_type(__a), _M_node()
    { }
      };
 
      _List_impl _M_impl;
C++
1
2
  template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
    class list : protected _List_base<_Tp, _Alloc>

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  /**
   *  @brief A list::iterator.
   *
   *  All the functions are op overloads.
  */
  template<typename _Tp>
    struct _List_iterator
    {
      typedef _List_iterator<_Tp>                _Self;
      typedef _List_node<_Tp>                    _Node;
 
      typedef ptrdiff_t                          difference_type;
      typedef std::bidirectional_iterator_tag    iterator_category;
      typedef _Tp                                value_type;
      typedef _Tp*                               pointer;
      typedef _Tp&                               reference;
 
      _List_iterator()
      : _M_node() { }
 
      explicit
      _List_iterator(__detail::_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 std::__addressof(static_cast<_Node*>(_M_node)->_M_data); }
 
      _Self&
      operator++()
      {
    _M_node = _M_node->_M_next;
    return *this;
      }
 
      _Self
      operator++(int)
      {
    _Self __tmp = *this;
    _M_node = _M_node->_M_next;
    return __tmp;
      }
 
      _Self&
      operator--()
      {
    _M_node = _M_node->_M_prev;
    return *this;
      }
 
      _Self
      operator--(int)
      {
    _Self __tmp = *this;
    _M_node = _M_node->_M_prev;
    return __tmp;
      }
 
      bool
      operator==(const _Self& __x) const
      { return _M_node == __x._M_node; }
 
      bool
      operator!=(const _Self& __x) const
      { return _M_node != __x._M_node; }
 
      // The only member points to the %list element.
      __detail::_List_node_base* _M_node;
    };
Итого. Каждый элемент это _List_node_base, а если точнее _List_node<T>.
Каждый элемент списка занимает 8 + sizeof(T) байт на 32-битной машине.
Проверка.

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <list>
 
int main()
{
   std::list<int> lst = {1};
   std::list<int>::iterator iter = lst.begin();
   std::cout << "Sizeof 1 element: " << 
      sizeof(*reinterpret_cast<std::_List_node<int>*>(iter._M_node)) << std::endl;
}
http://liveworkspace.org/code/fd33c1...334c50144bfbc7
 
Текущее время: 09:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru