Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Zzzs
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 2
#1

Как stl контейнеры работают с объектами различных типов данных? - C++

05.02.2016, 09:06. Просмотров 361. Ответов 10
Метки нет (Все метки)

Интересует определяют ли STL контейнеры (в частности vector) какой тип данных они хранят, для соответсвтующей работе с ними в памяти? Если да, то как?
Я знаю в Qt тип необходимо задавать вручную через Q_DECLARE_TYPEINFO. В stl я ничего такого не нашел, там определение происходит автоматически, или же вообще все типы считаются комплексными и memcpy() и memmove() не используются?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2016, 09:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как stl контейнеры работают с объектами различных типов данных? (C++):

Контейнеры, способные хранить данные произвольных (различных) типов - C++
Добрый лень. Существуют ли контейнеры (стандартные, не стандартные - не важно), которые способны хранить данные разных типов, то есть...

Как сохранить контейнеры STL в файл. И как потом их прочитать из файла - C++
В Qt такой контейнер как map<T,T> библиотеки STL заносится в файл занесением в поток "<<map;" , а как это можно сделать в C++ BUILDER6.0...

Как работают файлы-контейнеры? - C++
Не знаю, как правильно сформулировать. Некоторые крупные программы использует файлы (которые хранят в себе большое количество других...

Как создать шаблон класса, который сможет принимать в качестве значения любые stl контейнеры - C++
Как написать класс, в который можно засунуть vector<int>, или vector<float>, или deque<double> и т.д?

Контейнеры STL - C++
Кто знает где найти информацию по поводу стандартных контейнеров STL? Интересует не то, как их применять, а основы реализации. Может быть...

Начала STL и контейнеры C++ - C++
Многие улучшения, сделанные из C в C++ вызывают сомнения и вопросы... Именно поэтому, наверное, при любви к C++ вузовских пЫдагогов, в...

10
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.02.2016, 10:18 #2
Zzzs, Эм.
C++
1
std::vector<T>
где T это тип. Как это можно было не найти?
1
Croessmah
Ушел
13762 / 8012 / 922
Регистрация: 27.09.2012
Сообщений: 19,720
Записей в блоге: 3
Завершенные тесты: 1
05.02.2016, 10:57 #3
ForEveR, может имеются ввиду оптимизации?
Знаешь, типа
C++
1
2
3
4
5
6
7
new_data = allocator::allocate(...) ;
copy<is_pod<T>::value>(...) ;
...
copy<true>(...)
{
   memmove(...) ;
}
2
Zzzs
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 2
05.02.2016, 11:34  [ТС] #4
Он точно проверяет только на POD?
Если у меня есть класс:
C++
1
2
3
4
5
6
7
class Circle {
public:
    Circle();
    Circle(const Vertex &position_, const float &size_);
    Vertex position;
    float size;
};
Он уже не является POD, но тем не менее его можно копировать через memcpy, т.к. он не содержит указателей. Как в данном случае поведет себя контейнер:
C++
1
2
3
std::vector<Circle> a;
// ... filling a ...
std::vector<Circle> b = a;
Неужели будет копировать поэлементно с вызовом конструктора на каждый элемент?
0
Croessmah
Ушел
13762 / 8012 / 922
Регистрация: 27.09.2012
Сообщений: 19,720
Записей в блоге: 3
Завершенные тесты: 1
05.02.2016, 11:48 #5
Цитата Сообщение от Zzzs Посмотреть сообщение
Он точно проверяет только на POD?
Он вообще врядли проверяет. Это я просто пример привел.
Цитата Сообщение от Zzzs Посмотреть сообщение
Как в данном случае поведет себя контейнер
Загляните в исходники
1
Kastaneda
Jesus loves me
Эксперт С++
4749 / 2953 / 242
Регистрация: 12.12.2009
Сообщений: 7,491
Записей в блоге: 2
Завершенные тесты: 1
05.02.2016, 11:53 #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Он вообще врядли проверяет
Проверяет (хотя конечно от реализации STL зависит). Где-то читал, что в g++ сделали copy в 2000 строк, там как раз идут всякие проверки и делается максимально эффективное копирование. Внутрь правда не заглядывал.
0
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
05.02.2016, 11:59 #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
Проверяет (хотя конечно от реализации STL зависит). Где-то читал, что в g++ сделали copy в 2000 строк, там как раз идут всякие проверки и делается максимально эффективное копирование. Внутрь правда не заглядывал.
Вы, видимо, имеете в виду выравнивание, количество данных, расширения архитектуры и т.п... Тут речь немного о другом, насколько я понял.
0
Kastaneda
Jesus loves me
Эксперт С++
4749 / 2953 / 242
Регистрация: 12.12.2009
Сообщений: 7,491
Записей в блоге: 2
Завершенные тесты: 1
05.02.2016, 12:09 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от castaway Посмотреть сообщение
Вы, видимо, имеете в виду выравнивание, количество данных, расширения архитектуры и
Нет, я имел ввиду как раз оптимизации
Вот заглянул
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
inline _OI
    __copy_move_a(_II __first, _II __last, _OI __result) // это дергается из std::copy
    {
      typedef typename iterator_traits<_II>::value_type _ValueTypeI;
      typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
      typedef typename iterator_traits<_II>::iterator_category _Category;
      const bool __simple = (__is_trivial(_ValueTypeI) // очевидно для какой-то оптимизация
                         && __is_pointer<_II>::__value
                         && __is_pointer<_OI>::__value
                 && __are_same<_ValueTypeI, _ValueTypeO>::__value);
 
      return std::__copy_move<_IsMove, __simple,
                          _Category>::__copy_m(__first, __last, __result);
    }
это одна из реализаций __copy_move
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct __copy_move<_IsMove, true, random_access_iterator_tag>
    {
      template<typename _Tp>
        static _Tp*
        __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
        {
#if __cplusplus >= 201103L
      // trivial types can have deleted assignment
      static_assert( is_copy_assignable<_Tp>::value,
                     "type is not assignable" );
#endif
      const ptrdiff_t _Num = __last - __first;
      if (_Num)
        __builtin_memmove(__result, __first, sizeof(_Tp) * _Num); // ВОТ!
      return __result + _Num;
    }
Как мы видим для тех типов, для которых можно сделать просто memmove оно делается.

Добавлено через 3 минуты
Кстати интересную штуку нашел, ForEveR недавно концепты упоминал, вот похоже уже используются
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename _II, typename _OI>
    inline _OI
    copy(_II __first, _II __last, _OI __result)
    {
      // concept requirements
      __glibcxx_function_requires(_InputIteratorConcept<_II>)
      __glibcxx_function_requires(_OutputIteratorConcept<_OI,
        typename iterator_traits<_II>::value_type>)
      __glibcxx_requires_valid_range(__first, __last);
 
      return (std::__copy_move_a2<__is_move_iterator<_II>::__value>
          (std::__miter_base(__first), std::__miter_base(__last),
           __result));
    }
4
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
05.02.2016, 12:10 #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
Нет, я имел ввиду как раз оптимизации
Так я и говорю что вы имеете в виду оптимизации.
0
Kastaneda
Jesus loves me
Эксперт С++
4749 / 2953 / 242
Регистрация: 12.12.2009
Сообщений: 7,491
Записей в блоге: 2
Завершенные тесты: 1
05.02.2016, 12:11 #10
Цитата Сообщение от castaway Посмотреть сообщение
Так я и говорю что вы имеете в виду оптимизации.
На сколько я понял вопрос был как раз об этом
Цитата Сообщение от Zzzs Посмотреть сообщение
или же вообще все типы считаются комплексными и memcpy() и memmove() не используются?
0
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
05.02.2016, 12:13 #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
На сколько я понял вопрос был как раз об этом
Х.з. Я не могу с уверенностью сказать что имел в виду ТС. А додумывать будет неправильно с нашей стороны.
0
05.02.2016, 12:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2016, 12:13
Привет! Вот еще темы с ответами:

Начала STL и контейнеры C++ - C++
Вот такой вот простенький текст предлагается &quot;Начала STL и контейнеры C++&quot;. Скачать свободно можете здесь - и короткие главки (их 21 на...

[C++11] STL unordered контейнеры - C++
Думаю, проще всего мою проблему/задачу описать псевдокодом. class MyClass { void Something() { ...

Контейнеры Stl, экзамен - C++
Очень прошу помочь на экзамене! Написать программу: в контейнере имеется некоторый набор чисел, скопировать элементы, которые встречаются...

Ассоциативные контейнеры STL - C++
Везде сказано: set - упорядоченное множество уникальных элементов. (есть куча примеров и уроков) multiset - то же что и set, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru