Зачем нужен итератор?
От: ND322  
Дата: 23.07.10 15:57
Оценка:
Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы?
Заранее спасибо!

31.07.10 12:14: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Зачем нужен итератор?
От: Vamp Россия  
Дата: 23.07.10 16:25
Оценка:
ND>Заранее спасибо!
Основная польза — итераторы позволяют строить алогритмы, независимые от контейнера. Передаешь в алогоритм пару итераторов — и алогритм выполняет с итераторами, а не с контейнером, таким образом, становится контейнеро-независимым.
Да здравствует мыло душистое и веревка пушистая.
Re: Зачем нужен итератор?
От: potapov.d  
Дата: 23.07.10 16:43
Оценка: 7 (2) :)
Здравствуйте, ND322, Вы писали:

ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы?

ND>Заранее спасибо!

Вы отстали от жизни, согласно последним инновационным предложениям от классиков итератор не_нужен.
Re[2]: Зачем нужен итератор?
От: morm Россия  
Дата: 23.07.10 17:47
Оценка:
Здравствуйте, 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;
    }
}
Re[3]: Зачем нужен итератор?
От: c-smile Канада http://terrainformatica.com
Дата: 23.07.10 17:56
Оценка:
Здравствуйте, morm, Вы писали:

M>Или например в map без итераторов сложно выкрутиться в таком случае:


M>
M>class A
M>{
M>  MType m;
M>  public:
M>    typedef map<int, float> MType;
M>    float GetVal(int key) const
M>    {
M>       MType::const_iterator itr = m.find(key);
M>       if(itr == m.end())
M>         throw MErr(string("Нет элемента с номером ") + lexical_cast<string>(key));
M>       return itr->second;
M>    }
M>}

M>


map<int, float> есть коллекция pair<int, float>. Если есть коллекция есть значит есть range.

MType::range r = m.find(key);
if(r.empty())
  throw MErr(string("Нет элемента с номером ") + lexical_cast<string>(key));
return r.front().second;
Re: Зачем нужен итератор?
От: minorlogic Украина  
Дата: 23.07.10 21:23
Оценка:
Здравствуйте, ND322, Вы писали:

ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы?

ND>Заранее спасибо!

Итератор это абстракция позволяющая представить МНОЖЕСТВО однотипных объектов. Абстракция позволяющая работать как с указателями в памяти так и с очень сложными коллекциями(графы например).

Т.е. это унифицированный интерфейс доступа к элементам множетсва. Не больше ни меньше.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: Зачем нужен итератор?
От: ononim  
Дата: 23.07.10 21:44
Оценка:
> В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций.
Итераторы используются для итерирования произвольных контейнеров.
Итерация при помощи индексов (типа в CList) эффективно работает лишь для тех контейнеров, у которых доступ к произвольному элементу по индексу возможен за константное время. Но имеется туева хуча других типов контейнеров, где индексы ни к селу ни к городу, тот же связный список, не говоря уж о деревьях. Так вот, чтобы не вводить для каждого типа контейнера свой способ итерации и чтобы можно было использовать обобщенные алгоритмы (к примеру, поиск совпадающего элемента последовательным перебором) для различных типов контейнеров были придуманы итераторы. Сорри за небольшой каламбуризм.
И кстати никакой сложности на самом деле нету — просто немного непривычно. И вообще доступ по индексу на самом деле сложнее — ведь тут присутствует дополнительное понятия "индекс" которое может быть совершенно неинтересно с т.з. алгоритма который осуществляет доступ к контейнеру.

> Где используются эти пресловутые классы-итераторы?

Очень даже используется.
Как много веселых ребят, и все делают велосипед...
Re[4]: Зачем нужен итератор?
От: morm Россия  
Дата: 24.07.10 07:29
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, morm, Вы писали:


M>>Или например в map без итераторов сложно выкрутиться в таком случае:


M>>
M>>class A
M>>{
M>>  MType m;
M>>  public:
M>>    typedef map<int, float> MType;
M>>    float GetVal(int key) const
M>>    {
M>>       MType::const_iterator itr = m.find(key);
M>>       if(itr == m.end())
M>>         throw MErr(string("Нет элемента с номером ") + lexical_cast<string>(key));
M>>       return itr->second;
M>>    }
M>>}

M>>


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>


Это понятно, я написал как сейчас. Но range таскает за собой лишний функционал в этом примере.
Слишком толсто
От: rm822 Россия  
Дата: 24.07.10 08:04
Оценка: +1 :)
сабж
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Зачем нужен итератор?
От: ND322  
Дата: 24.07.10 17:02
Оценка:
Здравствуйте, ononim, Вы писали:

>> В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций.

O>Итераторы используются для итерирования произвольных контейнеров.
O>Итерация при помощи индексов (типа в CList) эффективно работает лишь для тех контейнеров, у которых доступ к произвольному элементу по индексу возможен за константное время. Но имеется туева хуча других типов контейнеров, где индексы ни к селу ни к городу, тот же связный список, не говоря уж о деревьях. Так вот, чтобы не вводить для каждого типа контейнера свой способ итерации и чтобы можно было использовать обобщенные алгоритмы (к примеру, поиск совпадающего элемента последовательным перебором) для различных типов контейнеров были придуманы итераторы. Сорри за небольшой каламбуризм.
O>И кстати никакой сложности на самом деле нету — просто немного непривычно. И вообще доступ по индексу на самом деле сложнее — ведь тут присутствует дополнительное понятия "индекс" которое может быть совершенно неинтересно с т.з. алгоритма который осуществляет доступ к контейнеру.

>> Где используются эти пресловутые классы-итераторы?

O>Очень даже используется.

Я понимаю, ЧТО такое итератор, я понимаю (но не использую пока на практике), что такое графы, очереди, двусвязные списки и т.д. и .п. Я не очень понимаю, в каких конкретно областях эти самые итераторы используются на практике? Вот я и спросил, в нажедже, что опытные люди просто приведут пример из жизни. Лично я вижу единственное реальное преимущество — мы можем для одной структуры (списка, дерева, ассоциативного массива и т.д.) иметь несколько текущих позиций и перебирать объекты в этих контейнерных структурах независимо — ну, например, имеем один стек, но вершин у него несколько и живут они независимо Правда, у меня за всю практическую деятельность, ни в одной реальной программе пока такой необходимости не возникало. Если бы возникло,я бы наверное тупо ввел две переменные-указателя на соответствующие текущие значения, да и перебирал бы себе дальше — дешево-сердито
Re[3]: Зачем нужен итератор?
От: ononim  
Дата: 24.07.10 18:09
Оценка:
ND>Я понимаю, ЧТО такое итератор, я понимаю (но не использую пока на практике), что такое графы, очереди, двусвязные списки и т.д. и .п. Я не очень понимаю, в каких конкретно областях эти самые итераторы используются на практике? Вот я и спросил, в нажедже, что опытные люди просто приведут пример из жизни.
Да пажалста. Я системщик. Обертки-итераторы вокруг FindFirstFile/FindNextFile, перечисление процессов, модулей, потоков etc — все это есть и применяется в нашем текущем проекте.

ND>Лично я вижу единственное реальное преимущество — мы можем для одной структуры (списка, дерева, ассоциативного массива и т.д.) иметь несколько текущих позиций и перебирать объекты в этих контейнерных структурах независимо — ну, например, имеем один стек, но вершин у него несколько и живут они независимо

Итератор это обобщенное понятие, придуманное для того чтобы обобщить методы последовательного доступа к элементам различных контейнеров и ничего более.
Что во первых позволяет не за??ирать голову программиста особенностями потрохов различных контейнеров, во вторых позволяет использовать один и тот же обобщенный (читай — шаблонный) С++ код для работы с различными контейнерами. То бишь читай здесь — http://www.cppreference.com/wiki/stl/algorithm/start и обрати внимание что приведенным там алгоритмам пофиг элементы какого контейнера им скармливают.
Как много веселых ребят, и все делают велосипед...
Re[5]: Зачем нужен итератор?
От: Vain Россия google.ru
Дата: 24.07.10 19:10
Оценка:
Здравствуйте, 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.]
[Даю очевидные ответы на риторические вопросы]
Re: Слишком толсто
От: Vain Россия google.ru
Дата: 24.07.10 19:17
Оценка:
Здравствуйте, rm822, Вы писали:

R>сабж

Вопросы новичков в STL воспринимаются уже как троллизм? однако.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Слишком толсто
От: rm822 Россия  
Дата: 24.07.10 21:14
Оценка: -1
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
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Слишком толсто
От: Vain Россия google.ru
Дата: 25.07.10 01:05
Оценка: 1 (1) -1 :)))
Здравствуйте, rm822, Вы писали:

V>>Вопросы новичков в STL воспринимаются уже как троллизм? однако.

R>Он нам предлагает сравнить STL c MFC-обрубками, которые тоже построены на итераторах, тока называются они там POSITION.
Как минимум для итераторов дребуется отдельный класс, POSITION это не класс, т.е. у него нет методов. С этой позиции MFC проще, т.к. меньше сущностей.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Зачем нужен итератор?
От: Vain Россия google.ru
Дата: 25.07.10 01:20
Оценка:
Здравствуйте, ND322, Вы писали:

ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы?

Итераторы, это результат попытки унифицировать доступ к элементу, а также унифицировать способ обхода (итерации по контейнеру) контейнера. Таким образом один и тот же способ будет необходим и достаточен, чтобы обойти конейнеры любых типов. Для этого тостаточно, чтобы контейнер объявлял определённый набор методов (begin/end) и эти методы работали с промежуточным объектом — итератором. Тогда способ доступа к элементу и итерации по контейнеру всегда будет одинаковыми.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Зачем нужен итератор?
От: McSeem2 США http://www.antigrain.com
Дата: 25.07.10 04:24
Оценка: 1 (1) +1 -3 :)))
Здравствуйте, ND322, Вы писали:

ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы?



Итераторы — это бездарная попытка использовать C++ не по назначению. Теоретически это прикольно, но на практике ничего кроме пожизненного рака головы не получается. Посмотрите на буст — это же просто помойка. Развитие C++ должно закончиться так же как Си и Фортрана. Любые попытки его развивать делают только хуже. В этом плане язык Си — более православный. Он стандартизирован, легок в имплементации и все хорошо. C++ — это монстр и кадавр, обеспокоенный желудочно.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Зачем нужен итератор?
От: LaptevVV Россия  
Дата: 25.07.10 06:01
Оценка:
Здравствуйте, ND322, Вы писали:

ND>Умные книжки много пишут о прелестях итераторов для различных контейнеров данных. Обычно приводятся примеры самостоятельных шаблонных классов, осуществляющих перебор элементов собственно контейнерного класса. Вот снова попалось в литературе, решил спросить мнение гуру. Где и как на практике используется эта крутизна? В чем преимущество перед обыкновенным CList\TList, который перебирает сои элементы сам без всяких сложных конструкций. Лично мне на практике всегда хватало его возможностей. Чего я не понимаю в этой жизни? Где используются эти пресловутые классы-итераторы?

ND>Заранее спасибо!
Определение:
Итератор — это объект, обеспечивающий последовательный доступ к элементам контейнера.
Вот и все.
В этом качестве он и нужен. Обозвать можно по-разному. ъ
Но все равно некая сущность, обеспечивающая последовательный доступ к элементам контейнера, нужна. ИМХО — это плюс.
В С++ его сделали произвольным — по аналогии с указателем.
ИМХО — это минус.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Зачем нужен итератор?
От: McSeem2 США http://www.antigrain.com
Дата: 25.07.10 06:52
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Итератор — это объект, обеспечивающий последовательный доступ к элементам контейнера.

LVV>Вот и все.

А тогда что такое "итератор произвольного доступа"? А такой есть и даже свойство такое есть. Это оксиморон.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: Зачем нужен итератор?
От: LaptevVV Россия  
Дата: 25.07.10 07:40
Оценка:
Здравствуйте, McSeem2, Вы писали:
LVV>>Итератор — это объект, обеспечивающий последовательный доступ к элементам контейнера.
LVV>>Вот и все.
MS>А тогда что такое "итератор произвольного доступа"? А такой есть и даже свойство такое есть. Это оксиморон.
Я таких иностранных слов не знаю...
Но В С++ многое сделано в угоду пресловутой обратной совместимости с С — это самая большая ошибка Страуструпа.
Вот и итераторы сделаны по аналогии с указателем — "естественным итератором" для массивов.
ИМХО — это дебилизм — обеспечение обратной совместимости. "Хотели — как лучше, а получилось — как всегда"(с)
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.