Есть словарь, отображающий, допустим, некоторое число на некоторую структуру: map<ROW_KEY, CRowFromat*>.
Надо пройти по всем элементам словаря и удалить те из них, у которых в структуре некоторе поле будет установлено в определенное значение. Я применил следующий код:
reverse_iterator пришлось применить так как тот же код с прямым итератором вызывал ошибку в erase(pIter->first)
Вопрос можно ли как-то к map применить алгоритм remove_if, чтобы не морочить себе голову с циклом? в MSDN-е есть пример только для list, а вот что передается в функцию-предикат в случае словаря?
Очень хотелось бы посмотреть на код.
Вопрос чисто из любопытства и в позновательных целях поэтому интересует именно возможность применения к map алгоритма remove_if или любого другого stl-алгоритма, реализующего такую функцию, хотя, по-моему, других таких нет.
Здравствуйте pesticide, Вы писали:
P>Хайолл!
P>Есть словарь, отображающий, допустим, некоторое число на некоторую структуру: map<ROW_KEY, CRowFromat*>. P>Надо пройти по всем элементам словаря и удалить те из них, у которых в структуре некоторе поле будет установлено в определенное значение. Я применил следующий код:
P>std::map<ROW_KEY, CRowFromat*>::reverse_iterator pIter; P>for(pIter = m_Rows.rbegin(); pIter != m_Rows.rend(); pIter--) P>{ P> CRowFromat *rf = pIter->second; P> if(rf->field == 7) P> { P> m_Rows.erase(pIter->first); P> } P>}
P>reverse_iterator пришлось применить так как тот же код с прямым итератором вызывал ошибку в erase(pIter->first)
P>Вопрос можно ли как-то к map применить алгоритм remove_if, чтобы не морочить себе голову с циклом? в MSDN-е есть пример только для list, а вот что передается в функцию-предикат в случае словаря? P>Очень хотелось бы посмотреть на код.
P>Вопрос чисто из любопытства и в позновательных целях поэтому интересует именно возможность применения к map алгоритма remove_if или любого другого stl-алгоритма, реализующего такую функцию, хотя, по-моему, других таких нет.
P>Заранее благодарен
P>Удачи
Здравствуйте pesticide, Вы писали:
P>Вопрос можно ли как-то к map применить алгоритм remove_if, чтобы не морочить себе голову с циклом? в MSDN-е есть пример только для list, а вот что передается в функцию-предикат в случае словаря? P>Очень хотелось бы посмотреть на код.
P>Вопрос чисто из любопытства и в позновательных целях поэтому интересует именно возможность применения к map алгоритма remove_if или любого другого stl-алгоритма, реализующего такую функцию, хотя, по-моему, других таких нет.
P>Заранее благодарен
К std::map, а равно и к другим ассоциативным контейнерам алгоритм remove_if применить нельзя. Ведь remove_if использует прямое присваивание одного элемента контейнера другому, импользуя forward_iterator, а это противоречит природе ассоциативных контейнеров (ну вернее не сам использует это присваивание, а вызывает remove_copy_if, в которой и происходит такое присваивание).
А вообще просто посмотри код этих двух функций — там все тривиально и сразу понятно.
А то, что тебе нужно, можно организовать так (только понадобиться дополнительный map):
Здравствуйте pesticide, Вы писали:
P>Вопрос можно ли как-то к map применить алгоритм remove_if, чтобы не морочить себе голову с циклом? в MSDN-е есть пример только для list, а вот что передается в функцию-предикат в случае словаря? P>Очень хотелось бы посмотреть на код.
remove_if применить для map не получится, т.к. remove_if из stl вместо того чтобы просто удалять элементы, копирует поздние элементы на место предыдущих удаленных (что может быть хорошо для vector-а, но совсем не подходит для остальных коллекций list, map, set)
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте pesticide, Вы писали:
P>>Вопрос можно ли как-то к map применить алгоритм remove_if, чтобы не морочить себе голову с циклом? в MSDN-е есть пример только для list, а вот что передается в функцию-предикат в случае словаря? P>>Очень хотелось бы посмотреть на код.
DG>remove_if применить для map не получится, т.к. remove_if из stl вместо того чтобы просто удалять элементы, копирует поздние элементы на место предыдущих удаленных (что может быть хорошо для vector-а, но совсем не подходит для остальных коллекций list, map, set)
Почему не подходит? От такого 'remove_if' до 'remove_if' с удалением — один шаг. Если у нас есть предикат 'pr' и map 'm', то сделать удаление можно так:
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Почему не подходит? От такого 'remove_if' до 'remove_if' с удалением — один шаг. Если у нас есть предикат 'pr' и map 'm', то сделать удаление можно так:
АТ>
Потому, что многие коллекции не поддерживают копирования полных элементов, в частности, map.
Во вторых, даже если копирование елементов поддерживается, как например в list, то выше приведенный алгоритм будет не оптимален, по сравнению с моим вариантом.
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте Андрей Тарасевич, Вы писали:
АТ>>Почему не подходит? От такого 'remove_if' до 'remove_if' с удалением — один шаг. Если у нас есть предикат 'pr' и map 'm', то сделать удаление можно так:
АТ>>
DG>Потому, что многие коллекции не поддерживают копирования полных элементов, в частности, map.
Хм... Логично.
DG>Во вторых, даже если копирование елементов поддерживается, как например в list, то выше приведенный алгоритм будет не оптимален, по сравнению с моим вариантом.