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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> iterator для map 
:(
    Опции темы
Vyacheslav
Дата 3.8.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



как разрешить проблему
Код

typedef std::map<string, RegistryEntry*> EntryMap;
typedef EntryMap::iterator EntryMapIterator;
....

 EntryMapIterator result =  m_children.find(sEntryId); // ошибка


Цитата

[C++ Error] RegistryEntry.cpp(63): E2034 Cannot convert '_Rb_tree_iterator<EntryMapValue,_Const_traits<EntryMapValue> >' to 'EntryMapIterator'


Каой тип объявить в качестве result?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
comcon1
Дата 3.8.2005, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Используй вместо
typedef EntryMap::iterator EntryMapIterator;
вот это
typedef EntryMap::const_iterator EntryMapIterator
--- Хотя на MSDN-е указана возможность для map.find() ...
Код

iterator find(
   const Key& _Key
);
const_iterator find(
   const Key& _Key
) const;


...присваиваться просто итератору. Но я плохо представляю как две функции перегружены по возвращаемому значению и как вызывать первую. Я использую вторую.
Может быть первую вызывать так:
find_res = (*mymap.find( key )).second;

Это сообщение отредактировал(а) comcon1 - 3.8.2005, 16:25


--------------------
PM MAIL   Вверх
Vyacheslav
Дата 3.8.2005, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Спасибо. В общем я то же вышел на на const_iterator.

Дополнительный вопрос
нужно реализовать для map типа
Код

for_each(m_children.begin(), m_children.end(), mem_fun(&RegistryEntry::destroy));


Но iterator при разименовании возвращает pair вместо RegistryEntry*
как быть?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
LPBOY
Дата 3.8.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Первое что приходит в голову: написать свою версию алгоритма

Код

template<class _InIt, class _Fn1> inline
    _Fn1 for_each_second(_InIt _First, _InIt _Last, _Fn1 _Func)
    {    
    for (; _First != _Last; ++_First)
        _Func((*_First).second);
    return (_Func);
    }

--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Vyacheslav
Дата 3.8.2005, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Ну тогда можно и темплаейтами не заморачиваться
Код

for(EntryMapIterator i = m_children.begin(); i !=  m_children.end(); i++) {
        delete (*i).second;
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
LPBOY
Дата 3.8.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Извини. Но если писать адаптеры то будет пострашнее.(ИМХО)

А что не понравилось? Код будет спрятан в хедере точно так же как for_each,
и пользоваться так же удобно как и for_each. Что по-твоему больше в духе темплейтов?

PS см. boost::bind
Добавлено @ 17:40
http://www.boost.org/libs/bind/bind.html#w...member_pointers

Это сообщение отредактировал(а) LPBOY - 3.8.2005, 17:51
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Earnest
Дата 3.8.2005, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(comcon1 @ 3.8.2005, 16:15)
Но я плохо представляю как две функции перегружены по возвращаемому значению и как вызывать первую.


Они перегружаются по контексту - они не только возвращаемым значением отличаются: одна из них константная. Так что для конст-объекта всегда вызывается вторая функция (константная), а для не-конст - первая.
Это вообще-то стандартный прием - определять пару "почти" одинаковых функций - посмотри, например, оператор [] для массива и т.д. Без этого очень трудно жить, если последовательно объявлять константным все, что по логике-семантике таковым является. Не-конст find не вызовешь из константного метода. С другой стороны, иногда нужно найти объект, чтобы его удалить, так что здесь const_iterator никак не пойдет.

Цитата(LPBOY @ 3.8.2005, 17:39)
Извини. Но если писать адаптеры то будет пострашнее.(ИМХО)


Да ладно! в данном случае обертка будет тривиальная. Имя ей можно дать "говорящее" - "делать то-то" - что весьма повышает читаемость.
Кроме того, использование алгоритмов типа for_each и пр. дает возможность даже не вспоминать, какого типа там итератор должен быть (а иногда эти определения бывают весьма многоэтажными): есть begin-end, и слава богу.
Я часто пишу свои локальные алгоритмы-обработчики как шаблоны по итератору, даже если точно знаю, что будет ровно одно инстационирование: типы итераторов могут быть вложенными во внутренние private классы, и вытаскивать их наружу ради пары алгоритмов не хочется. А шаблонному алгоритму надо только чтобы тип был виден в точке вызова.

Ну и всегда есть возможность использовать бустовские binder'ы - они значительно удобнее и лучше читаются.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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