Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы?
Заранее спасибо!
31.07.10 12:14: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
ND>Заранее спасибо!
Основная польза — итераторы позволяют строить алогритмы, независимые от контейнера. Передаешь в алогоритм пару итераторов — и алогритм выполняет с итераторами, а не с контейнером, таким образом, становится контейнеро-независимым.
Здравствуйте, ND322, Вы писали:
ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы? ND>Заранее спасибо!
Вы отстали от жизни, согласно последним инновационным предложениям от классиков итератор не_нужен.
Здравствуйте, potapov.d, Вы писали:
PD>Здравствуйте, ND322, Вы писали:
ND>>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы? ND>>Заранее спасибо!
PD>Вы отстали от жизни, согласно последним инновационным предложениям от классиков итератор не_нужен.
Андрей как всегда радикален Пока, однако, они используются. MType::iterator itr = find_if(v.begin(),v.end(),boost::bind(&foo, boost::lambda::_1));
Или например в map без итераторов сложно выкрутиться в таком случае:
class A
{
MType m;
public:
typedef map<int, float> MType;
float GetVal(int key) const
{
MType::const_iterator itr = m.find(key);
if(itr == m.end())
throw MErr(string("Нет элемента с номером ") + lexical_cast<string>(key));
return itr->second;
}
}
Здравствуйте, ND322, Вы писали:
ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы? ND>Заранее спасибо!
Итератор это абстракция позволяющая представить МНОЖЕСТВО однотипных объектов. Абстракция позволяющая работать как с указателями в памяти так и с очень сложными коллекциями(графы например).
Т.е. это унифицированный интерфейс доступа к элементам множетсва. Не больше ни меньше.
> В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций.
Итераторы используются для итерирования произвольных контейнеров.
Итерация при помощи индексов (типа в CList) эффективно работает лишь для тех контейнеров, у которых доступ к произвольному элементу по индексу возможен за константное время. Но имеется туева хуча других типов контейнеров, где индексы ни к селу ни к городу, тот же связный список, не говоря уж о деревьях. Так вот, чтобы не вводить для каждого типа контейнера свой способ итерации и чтобы можно было использовать обобщенные алгоритмы (к примеру, поиск совпадающего элемента последовательным перебором) для различных типов контейнеров были придуманы итераторы. Сорри за небольшой каламбуризм.
И кстати никакой сложности на самом деле нету — просто немного непривычно. И вообще доступ по индексу на самом деле сложнее — ведь тут присутствует дополнительное понятия "индекс" которое может быть совершенно неинтересно с т.з. алгоритма который осуществляет доступ к контейнеру.
> Где используются эти пресловутые классы-итераторы?
Очень даже используется.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
>> В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. O>Итераторы используются для итерирования произвольных контейнеров. O>Итерация при помощи индексов (типа в CList) эффективно работает лишь для тех контейнеров, у которых доступ к произвольному элементу по индексу возможен за константное время. Но имеется туева хуча других типов контейнеров, где индексы ни к селу ни к городу, тот же связный список, не говоря уж о деревьях. Так вот, чтобы не вводить для каждого типа контейнера свой способ итерации и чтобы можно было использовать обобщенные алгоритмы (к примеру, поиск совпадающего элемента последовательным перебором) для различных типов контейнеров были придуманы итераторы. Сорри за небольшой каламбуризм. O>И кстати никакой сложности на самом деле нету — просто немного непривычно. И вообще доступ по индексу на самом деле сложнее — ведь тут присутствует дополнительное понятия "индекс" которое может быть совершенно неинтересно с т.з. алгоритма который осуществляет доступ к контейнеру.
>> Где используются эти пресловутые классы-итераторы? O>Очень даже используется.
Я понимаю, ЧТО такое итератор, я понимаю (но не использую пока на практике), что такое графы, очереди, двусвязные списки и т.д. и .п. Я не очень понимаю, в каких конкретно областях эти самые итераторы используются на практике? Вот я и спросил, в нажедже, что опытные люди просто приведут пример из жизни. Лично я вижу единственное реальное преимущество — мы можем для одной структуры (списка, дерева, ассоциативного массива и т.д.) иметь несколько текущих позиций и перебирать объекты в этих контейнерных структурах независимо — ну, например, имеем один стек, но вершин у него несколько и живут они независимо Правда, у меня за всю практическую деятельность, ни в одной реальной программе пока такой необходимости не возникало. Если бы возникло,я бы наверное тупо ввел две переменные-указателя на соответствующие текущие значения, да и перебирал бы себе дальше — дешево-сердито
ND>Я понимаю, ЧТО такое итератор, я понимаю (но не использую пока на практике), что такое графы, очереди, двусвязные списки и т.д. и .п. Я не очень понимаю, в каких конкретно областях эти самые итераторы используются на практике? Вот я и спросил, в нажедже, что опытные люди просто приведут пример из жизни.
Да пажалста. Я системщик. Обертки-итераторы вокруг FindFirstFile/FindNextFile, перечисление процессов, модулей, потоков etc — все это есть и применяется в нашем текущем проекте.
ND>Лично я вижу единственное реальное преимущество — мы можем для одной структуры (списка, дерева, ассоциативного массива и т.д.) иметь несколько текущих позиций и перебирать объекты в этих контейнерных структурах независимо — ну, например, имеем один стек, но вершин у него несколько и живут они независимо
Итератор это обобщенное понятие, придуманное для того чтобы обобщить методы последовательного доступа к элементам различных контейнеров и ничего более.
Что во первых позволяет не за??ирать голову программиста особенностями потрохов различных контейнеров, во вторых позволяет использовать один и тот же обобщенный (читай — шаблонный) С++ код для работы с различными контейнерами. То бишь читай здесь — http://www.cppreference.com/wiki/stl/algorithm/start и обрати внимание что приведенным там алгоритмам пофиг элементы какого контейнера им скармливают.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, morm, Вы писали:
CS>>map<int, float> есть коллекция pair<int, float>. Если есть коллекция есть значит есть range. CS>>
CS>>MType::range r = m.find(key);
CS>>if(r.empty())
CS>> throw MErr(string("Нет элемента с номером ") + lexical_cast<string>(key));
CS>>return r.front().second;
CS>>
M>Это понятно, я написал как сейчас. Но range таскает за собой лишний функционал в этом примере.
Так и итераторов будет два, если функцию find обернуть — придётся всегда пару итераторов возвращать, тогда как range уже какбе пара итераторов.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
V>Вопросы новичков в STL воспринимаются уже как троллизм? однако.
Он нам предлагает сравнить STL c MFC-обрубками, которые тоже построены на итераторах, тока называются они там POSITION.
скопипастил код из MSDN, ну и где простота vs stl и отсутствие итераторов?
CTypedPtrList<CObList, CPerson*> myList;
myList.AddHead(new CPerson());
POSITION pos = myList.GetHeadPosition();
while(pos != NULL)
{
CPerson* thePerson = myList.GetNext(pos);
thePerson->AssertValid();
}
CMap<CString, LPCTSTR, CPerson*, CPerson*> myMap;
CPerson myPerson;
myMap.SetAt(_T("Bill"), &myPerson);
POSITION pos = myMap.GetStartPosition();
while(pos != NULL)
{
CPerson* pPerson;
CString string;
// Get key (string) and value (pPerson)
myMap.GetNextAssoc(pos, string, pPerson);
// Use string and pPerson
}
Здравствуйте, rm822, Вы писали:
V>>Вопросы новичков в STL воспринимаются уже как троллизм? однако. R>Он нам предлагает сравнить STL c MFC-обрубками, которые тоже построены на итераторах, тока называются они там POSITION.
Как минимум для итераторов дребуется отдельный класс, POSITION это не класс, т.е. у него нет методов. С этой позиции MFC проще, т.к. меньше сущностей.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, ND322, Вы писали:
ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы?
Итераторы, это результат попытки унифицировать доступ к элементу, а также унифицировать способ обхода (итерации по контейнеру) контейнера. Таким образом один и тот же способ будет необходим и достаточен, чтобы обойти конейнеры любых типов. Для этого тостаточно, чтобы контейнер объявлял определённый набор методов (begin/end) и эти методы работали с промежуточным объектом — итератором. Тогда способ доступа к элементу и итерации по контейнеру всегда будет одинаковыми.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, ND322, Вы писали:
ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы?
Итераторы — это бездарная попытка использовать C++ не по назначению. Теоретически это прикольно, но на практике ничего кроме пожизненного рака головы не получается. Посмотрите на буст — это же просто помойка. Развитие C++ должно закончиться так же как Си и Фортрана. Любые попытки его развивать делают только хуже. В этом плане язык Си — более православный. Он стандартизирован, легок в имплементации и все хорошо. C++ — это монстр и кадавр, обеспокоенный желудочно.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, ND322, Вы писали:
ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы? ND>Заранее спасибо!
Определение:
Итератор — это объект, обеспечивающий последовательный доступ к элементам контейнера.
Вот и все.
В этом качестве он и нужен. Обозвать можно по-разному. ъ
Но все равно некая сущность, обеспечивающая последовательный доступ к элементам контейнера, нужна. ИМХО — это плюс.
В С++ его сделали произвольным — по аналогии с указателем.
ИМХО — это минус.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, McSeem2, Вы писали: LVV>>Итератор — это объект, обеспечивающий последовательный доступ к элементам контейнера. LVV>>Вот и все. MS>А тогда что такое "итератор произвольного доступа"? А такой есть и даже свойство такое есть. Это оксиморон.
Я таких иностранных слов не знаю...
Но В С++ многое сделано в угоду пресловутой обратной совместимости с С — это самая большая ошибка Страуструпа.
Вот и итераторы сделаны по аналогии с указателем — "естественным итератором" для массивов.
ИМХО — это дебилизм — обеспечение обратной совместимости. "Хотели — как лучше, а получилось — как всегда"(с)
Хочешь быть счастливым — будь им!
Без булдырабыз!!!