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

C++

Войти
Регистрация
Восстановить пароль
 
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 338
#1

Объясните пожалуйста зачем нужна структура класса iterator_traits. - C++

23.01.2014, 18:42. Просмотров 863. Ответов 6
Метки нет (Все метки)

Всем привет!

Объясните пожалуйста зачем нужна структура класса iterator_traits. Ведь все тайпдефы, которые содержатся в этой структуре имеются в каждом стандартном контейнере.
И код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T>
typename iterator_traits<T>::reference func(T iter_begin)
{
typename iterator_traits<T>::reference d = *iter_begin;
return d;
}
 
int main()
{
    std::vector<int> vec;
    int init = 0;
    std::generate_n(std::back_inserter(vec), 10, [&] () -> int {return ++init;});
 
    std::vector<int>::iterator iter_begin = vec.begin();
 
    cerr << func(iter_begin) << endl;
 
    return 0; 
}
можно записать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T>
typename T::reference func(T iter_begin)
{
typename T::reference d = *iter_begin;
return d;
}
 
int main()
{
    std::vector<int> vec;
    int init = 0;
    std::generate_n(std::back_inserter(vec), 10, [&] () -> int {return ++init;});
 
    std::vector<int>::iterator iter_begin = vec.begin();
 
    cerr << func(iter_begin) << endl;
 
    return 0; 
}
Их предназначение ограничивается созданием пользовательских контейнеров?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2014, 18:42     Объясните пожалуйста зачем нужна структура класса iterator_traits.
Посмотрите здесь:

зачем нужна перестановка C++
C++ Зачем нужна ссылка в конструкторе копирования
Объясните зачем нужны конструкторы C++
C++ Объясните, пожалуйста, зачем в C++ нужны указатели
Что такое рекурсия? Зачем она нужна? C++
C++ Зачем присваивать переменной disc ноль? Объясните пожалуйста
C++ Зачем нужна функция GetPrivateProfileString?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14659 / 6605 / 1046
Регистрация: 02.05.2013
Сообщений: 10,881
Завершенные тесты: 1
23.01.2014, 19:57     Объясните пожалуйста зачем нужна структура класса iterator_traits. #2
Интересный вопрос.

Представьте, что итератор для какого-то контейнера на самом деле
является обычным указателем. Но для алгоритмов из STL нужно больше
сведений, чем этот указатель может предоставить, а поместить "внутрь"
него соответствующие typedef-ы нельзя. Вот для этого, в частности, и
нужны traits.
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 338
23.01.2014, 20:14  [ТС]     Объясните пожалуйста зачем нужна структура класса iterator_traits. #3
И помещая этот указатель к traits я делаю из него итератор, способный работать с обобщенными алгоритмами... ?
Убежденный
Системный программист
 Аватар для Убежденный
14659 / 6605 / 1046
Регистрация: 02.05.2013
Сообщений: 10,881
Завершенные тесты: 1
23.01.2014, 21:21     Объясните пожалуйста зачем нужна структура класса iterator_traits. #4
Чтобы сделать STL-совместимый итератор, нужно удовлетворить всем требованиям,
описанным в разделе стандарта C++ "Iterator Requirements", в том числе и traits.
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,911
Завершенные тесты: 1
24.01.2014, 17:50     Объясните пожалуйста зачем нужна структура класса iterator_traits. #5
Цитата Сообщение от Убежденный Посмотреть сообщение
Но для алгоритмов из STL нужно больше
сведений, чем этот указатель может предоставить,
Кстати говоря, теперь это уже не так, всё содержимое iterator_traits для указателя легко выводится через decltype. Но, разумеется, на момент создания STL это был единственный вменяемый выход, который теперь, скорее всего, останется в стандарте очень надолго, если не насовсем, ради совместимости с уже наработанным кодом.
Убежденный
Системный программист
 Аватар для Убежденный
14659 / 6605 / 1046
Регистрация: 02.05.2013
Сообщений: 10,881
Завершенные тесты: 1
24.01.2014, 18:13     Объясните пожалуйста зачем нужна структура класса iterator_traits. #6
Цитата Сообщение от Nick Alte Посмотреть сообщение
всё содержимое iterator_traits для указателя легко выводится через decltype.
Что-то сомневаюсь. Как можно через decltype вывести iterator_category, например ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2014, 20:07     Объясните пожалуйста зачем нужна структура класса iterator_traits.
Еще ссылки по теме:

C++ Зачем нужна функция cin.ignore()?
Объясните пожалуйста, в чем здесь дело(структура и указатель) C++
C++ Объясните зачем нужен cin.get()
C++ Объясните, зачем в коде нужен явный конструктор копирования
Объясните, как работает sizeof() и зачем она в этой программе C++

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,911
Завершенные тесты: 1
24.01.2014, 20:07     Объясните пожалуйста зачем нужна структура класса iterator_traits. #7
Цитата Сообщение от Убежденный Посмотреть сообщение
Как можно через decltype вывести iterator_category, например ?
Формально её можно вывести через SFINAE с тем же decltype, по наличию операций, характерных для каждой категории. А по сути из элементарных (встроенных) типов на роль итератора только указатель и сгодится, а его категория уже сразу известна. Для других типов, не элементарных, уже ничто не помешает определять вложенные typedef-ы.
Yandex
Объявления
24.01.2014, 20:07     Объясните пожалуйста зачем нужна структура класса iterator_traits.
Ответ Создать тему
Опции темы

Текущее время: 13:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru