3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
1

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

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

Author24 — интернет-сервис помощи студентам
Всем привет!

Объясните пожалуйста зачем нужна структура класса 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; 
}
Их предназначение ограничивается созданием пользовательских контейнеров?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2014, 18:42
Ответы с готовыми решениями:

Объясните, пожалуйста, зачем в C++ нужны указатели
Никак что-то не пойму, зачем в C++ указатели? Ведь можно спокойно программировать без них.

Объясните зачем нужна данная функция
Довольно односложный вопрос. Когда и зачем используется данная функция (соответственно, что будет...

Зачем присваивать переменной disc ноль? Объясните пожалуйста
Зачем присваивать disc = 0 (см. 9 строчку кода: double oplata, disc=0; Препод говорит что нужен,...

Объясните пожалуйста зачем при авторизации создавать новую сессию
Всем доброго! Подскажите пож-та в чем разница между 2-мя подходами и какой правильнее: 1. При...

6
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.01.2014, 19:57 2
Интересный вопрос.

Представьте, что итератор для какого-то контейнера на самом деле
является обычным указателем. Но для алгоритмов из STL нужно больше
сведений, чем этот указатель может предоставить, а поместить "внутрь"
него соответствующие typedef-ы нельзя. Вот для этого, в частности, и
нужны traits.
1
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
23.01.2014, 20:14  [ТС] 3
И помещая этот указатель к traits я делаю из него итератор, способный работать с обобщенными алгоритмами... ?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.01.2014, 21:21 4
Чтобы сделать STL-совместимый итератор, нужно удовлетворить всем требованиям,
описанным в разделе стандарта C++ "Iterator Requirements", в том числе и traits.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
24.01.2014, 17:50 5
Цитата Сообщение от Убежденный Посмотреть сообщение
Но для алгоритмов из STL нужно больше
сведений, чем этот указатель может предоставить,
Кстати говоря, теперь это уже не так, всё содержимое iterator_traits для указателя легко выводится через decltype. Но, разумеется, на момент создания STL это был единственный вменяемый выход, который теперь, скорее всего, останется в стандарте очень надолго, если не насовсем, ради совместимости с уже наработанным кодом.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
24.01.2014, 18:13 6
Цитата Сообщение от Nick Alte Посмотреть сообщение
всё содержимое iterator_traits для указателя легко выводится через decltype.
Что-то сомневаюсь. Как можно через decltype вывести iterator_category, например ?
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
24.01.2014, 20:07 7
Цитата Сообщение от Убежденный Посмотреть сообщение
Как можно через decltype вывести iterator_category, например ?
Формально её можно вывести через SFINAE с тем же decltype, по наличию операций, характерных для каждой категории. А по сути из элементарных (встроенных) типов на роль итератора только указатель и сгодится, а его категория уже сразу известна. Для других типов, не элементарных, уже ничто не помешает определять вложенные typedef-ы.
0
24.01.2014, 20:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2014, 20:07
Помогаю со студенческими работами здесь

Объясните пожалуйста, в чем здесь дело(структура и указатель)
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;windows.h&gt; using namespace std; struct pizza...

Объясните, пожалуйста, создание экземпляра класса в примере
Добрый день, имеем пример кода: using System; // Абстрактный класс может быть унаследован от...

Структура С++ нужна допомога, не знаю почему программа не работает, пожалуйста
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string&gt; #include...

Объясните зачем нужны конструкторы
Зачем нужны конструкторы? Читаю в книгах, смотрю видеоуроки и все равно не понятно


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru