Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать тип итератора в методе begin() у класса, одно или дву направленный ... ? 
V
    Опции темы
EvilsInterrupt
Дата 27.7.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Если есть класс, и он возвращает методы begin(), end() которые дают итераторы, то возникает вопрос "а какой собственно тип ?". Ведь если знать тип, можно знать какие STL-алгоритмы можно использовать, а какие нет.

Как узнать тип, имея декларацию класса? Может быть заглянуть в декларацию потомка std::iterator, который возвращается этими методами ? А там если есть ряд методов, то уже делать выводы.

под типом понимаю слова : одно, дву направленный, произвольный, реверсивный, итератор потока и т.д. и т.п. ;)
PM MAIL WWW ICQ Jabber   Вверх
boostcoder
Дата 27.7.2010, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



у каждого контейнера есть тайпдефы используемых им итераторов.
Код

std::vector<int>::iterator beg = ...

в данном случае вам не нужно "узнавать" тип.
PM WWW   Вверх
Void
Дата 27.7.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 2
Всего: 173



Цитата(EvilsInterrupt @  27.7.2010,  23:43 Найти цитируемый пост)
под типом понимаю слова : одно, дву направленный, произвольный, реверсивный, итератор потока и т.д. и т.п. ;) 

См. iterator_traits::iterator_category в <iterator>.
Код

#include <vector>
#include <list>
#include <iterator>
#include <iostream>

template<typename T> struct iterator_tag_to_string
{
};

template<> struct iterator_tag_to_string<std::random_access_iterator_tag>
{
    static std::string str()
    {
        return "random-access";
    }
};

template<> struct iterator_tag_to_string<std::bidirectional_iterator_tag>
{
    static std::string str()
    {
        return "bidirectional";
    }
};

// наплодить специализаций для оставшихся типов

template<typename T> void print_iterator_kind(const T& it)
{
    std::cout << iterator_tag_to_string<typename std::iterator_traits<T>::iterator_category>::str() << std::endl;
}

int main()
{
    std::vector<int> v;
    std::list<int> s;
    print_iterator_kind(v.begin());
    print_iterator_kind(s.begin());
}



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
EvilsInterrupt
Дата 28.7.2010, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



То есть ответ на вопрос "какой тип итератора?" это "1) открыть декларацию 2) поглядеть typedef-ы" и только так?

Возьмем пример, typedef map<std::string, system::CDevice>::iterator DrvItr_t; как понять какого типа DevItr_t ?

Это сообщение отредактировал(а) EvilsInterrupt - 28.7.2010, 09:39
PM MAIL WWW ICQ Jabber   Вверх
boostcoder
Дата 28.7.2010, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(EvilsInterrupt @  28.7.2010,  09:38 Найти цитируемый пост)
То есть ответ на вопрос "какой тип итератора?" это "1) открыть декларацию 2) поглядеть typedef-ы" и только так?

не обязательно.
итератор, по сути, это указатель на тип. разыменование итератора вернет тип.

Цитата(EvilsInterrupt @  28.7.2010,  09:38 Найти цитируемый пост)
Возьмем пример, typedef map<std::string, system::CDevice>::iterator DrvItr_t; как понять какого типа DrvItr_t ? 

на сколько я помню, std::map<> хранит пары(std::pair<>). значит итератор - "указатель" на пары.
PM WWW   Вверх
mes
Дата 28.7.2010, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(EvilsInterrupt @  28.7.2010,  08:38 Найти цитируемый пост)
Возьмем пример, typedef map<std::string, system::CDevice>::iterator DrvItr_t; как понять какого типа DevItr_t ?

кому понять ? программисту или проге ?


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 28.7.2010, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



mes, программисту, чтобы случайно не написать код, который с STL-алгоритмом принимающего не  те типы итераторов
PM MAIL WWW ICQ Jabber   Вверх
boostcoder
Дата 28.7.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(EvilsInterrupt @  28.7.2010,  09:58 Найти цитируемый пост)
который с STL-алгоритмом принимающего не  те типы итераторов 

например?
PM WWW   Вверх
mes
Дата 28.7.2010, 10:07 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(EvilsInterrupt @  28.7.2010,  08:58 Найти цитируемый пост)
 программисту, 

в документации
smile


--------------------
PM MAIL WWW   Вверх
bsa
Дата 28.7.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



EvilsInterrupt, почитай Мейерса, кажется у него черным по белому написано - не пишите универсальные алгоритмы для всех видов контейнеров. Ты на этапе проектирования уже должен понимать, где какой контейнер находится и какие алгоритмы к нему применимы. Если ты решил, что для твоих задач лучше всего подходит list, то за использование sort тебе придется сильно заплатить перерасходом памяти и времени. Но в тоже время, операции вставки и удаления моментальные.
PM   Вверх
EvilsInterrupt
Дата 29.7.2010, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



bsa, Да, но сама идея STL и шаблонов, обобщить все что только можно обобщить ) Я как правило привык к ограничениям, а тут чуть ли не главная мысль ООП: обобщайте ) Вот и хочется писать правильно, т.е. обобщить все что токо можно )
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 29.7.2010, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(EvilsInterrupt @  28.7.2010,  23:50 Найти цитируемый пост)
 а тут чуть ли не главная мысль ООП: обобщайте ) Вот и хочется писать правильно,

только это не стыкуется с темой, Вы ж писали что знать надо 

Цитата(EvilsInterrupt @  28.7.2010,  08:58 Найти цитируемый пост)
 программисту, чтобы случайно не написать код, который 


А при обобщенном программировании знать должна программа (код), чтоб выбрать подходящее поведение.
smile

Добавлено через 2 минуты и 5 секунд
да и вообще с обобщением поосторожней.. не все можно обобщить без принесения жертв.
( либо заточенность под условия, либо обилия кода на разные варианты )
smile


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 29.7.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Пока вопросов нет, думаю стоит тему закрыть. КАк появятся, открою )
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.