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

C++

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

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

23.01.2014, 18:42. Просмотров 967. Ответов 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++ Builder
Используя справку C++Builder и добавив дополнительную кнопку, напишите обработчик события кнопки, который выводит ...

Объясните пожалуйста, как подключить библиотеку OpenCV к CodeGear C++ Builder 2007 - C++ Builder
Объясните новичку пожалуйста.

объясните пожалуйста ошибку в коде mfs - Visual C++
делала лабу по методичке, перепроверила 100 раз, находит ошибку void CP1Dlg::OnBnClickedP1Dialog() { // TODO: Add your control...

объясните пожалуйста то что отмечено как комментарии - Visual C++
вот такая программа #include &lt;string&gt; #include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; int main() { ifstream...

объясните, пожалуйста, смысл задания..как делали, какими способами.. - Visual C++
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &quot;004.h&quot; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char...

Зачем нужна функция SetCursor? - C++ WinAPI
объясните пожалуйста простым языком зачем нужна функция SetCursor, что она делает и при каких условиях используется.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Убежденный
Системный программист
Эксперт С++
15511 / 7009 / 1108
Регистрация: 02.05.2013
Сообщений: 11,441
Завершенные тесты: 1
23.01.2014, 19:57 #2
Интересный вопрос.

Представьте, что итератор для какого-то контейнера на самом деле
является обычным указателем. Но для алгоритмов из STL нужно больше
сведений, чем этот указатель может предоставить, а поместить "внутрь"
него соответствующие typedef-ы нельзя. Вот для этого, в частности, и
нужны traits.
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 344
23.01.2014, 20:14  [ТС] #3
И помещая этот указатель к traits я делаю из него итератор, способный работать с обобщенными алгоритмами... ?
Убежденный
Системный программист
Эксперт С++
15511 / 7009 / 1108
Регистрация: 02.05.2013
Сообщений: 11,441
Завершенные тесты: 1
23.01.2014, 21:21 #4
Чтобы сделать STL-совместимый итератор, нужно удовлетворить всем требованиям,
описанным в разделе стандарта C++ "Iterator Requirements", в том числе и traits.
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
24.01.2014, 17:50 #5
Цитата Сообщение от Убежденный Посмотреть сообщение
Но для алгоритмов из STL нужно больше
сведений, чем этот указатель может предоставить,
Кстати говоря, теперь это уже не так, всё содержимое iterator_traits для указателя легко выводится через decltype. Но, разумеется, на момент создания STL это был единственный вменяемый выход, который теперь, скорее всего, останется в стандарте очень надолго, если не насовсем, ради совместимости с уже наработанным кодом.
Убежденный
Системный программист
Эксперт С++
15511 / 7009 / 1108
Регистрация: 02.05.2013
Сообщений: 11,441
Завершенные тесты: 1
24.01.2014, 18:13 #6
Цитата Сообщение от Nick Alte Посмотреть сообщение
всё содержимое iterator_traits для указателя легко выводится через decltype.
Что-то сомневаюсь. Как можно через decltype вывести iterator_category, например ?
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
24.01.2014, 20:07 #7
Цитата Сообщение от Убежденный Посмотреть сообщение
Как можно через decltype вывести iterator_category, например ?
Формально её можно вывести через SFINAE с тем же decltype, по наличию операций, характерных для каждой категории. А по сути из элементарных (встроенных) типов на роль итератора только указатель и сгодится, а его категория уже сразу известна. Для других типов, не элементарных, уже ничто не помешает определять вложенные typedef-ы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2014, 20:07
Привет! Вот еще темы с ответами:

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

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

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

Объясните зачем нужен cin.get() - C++
В чем разница между int a; for (int i = 0; i &lt; 5; i++) { cin &gt;&gt; a; cin.get(); } и


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.01.2014, 20:07
Ответ Создать тему
Опции темы

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