Здравствуйте, Аноним, Вы писали:
А>привет всем. А>скажите пожалуйста, можно ли переписать нижеследующий код, применив std::for_each, и если да, то каким образом? А>
А> //выше имплементирован класс Entity
А> typedef std::map< std::string, boost::shared_ptr<Entity> > DataMap;
А> DataMap _data;
А> for (DataMap::const_iterator iter = _data.begin(); iter != _data.end(); ++iter) {
А> std::cout << (*iter->second).getValue() << std::endl;
А> }
А>
Можно.
Для этого надо вынести код в теле цикла в функтор.
Вариаты есть: собсвенный класс с оператором (), boost::bind, boost::lambda, ...
Кстати, можно использовать ostream_iterator и вместо for_each взять transform.
Здравствуйте, Аноним, Вы писали:
А>привет всем. А>скажите пожалуйста, можно ли переписать нижеследующий код, применив std::for_each, и если да, то каким образом? А>
А> //выше имплементирован класс Entity
А> typedef std::map< std::string, boost::shared_ptr<Entity> > DataMap;
А> DataMap _data;
А> for (DataMap::const_iterator iter = _data.begin(); iter != _data.end(); ++iter) {
А> std::cout << (*iter->second).getValue() << std::endl;
А> }
А>
Ну, при помощи boost::transform_iterator элементарно пишется итератор, который обеспечивает проход по std::map<Key,Value> как по последовательности Value, в результате у тебя внутри цикла будет просто iter->getValue(), ну а дальше все просто — хоть ostream_iterator, хоть лямбды...
Здравствуйте, Аноним, Вы писали:
А>привет всем. А>скажите пожалуйста, можно ли переписать нижеследующий код, применив std::for_each, и если да, то каким образом? А>
А> //выше имплементирован класс Entity
А> typedef std::map< std::string, boost::shared_ptr<Entity> > DataMap;
А> DataMap _data;
А> for (DataMap::const_iterator iter = _data.begin(); iter != _data.end(); ++iter) {
А> std::cout << (*iter->second).getValue() << std::endl;
А> }
А>
Если уж совсем надо, то что-то вроде этого.
(Пусть getValue() возвращает string.)
using boost::bind;
std::transform(_data.begin(), _data.end(), std::ostream_iterator<std::string>(std::cout, "\n"),
bind(&Entity::getValue, bind(&DataMap::value_type::second, _1)));
Здравствуйте, Smal, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>привет всем. А>>скажите пожалуйста, можно ли переписать нижеследующий код, применив std::for_each, и если да, то каким образом? А>>
А>> //выше имплементирован класс Entity
А>> typedef std::map< std::string, boost::shared_ptr<Entity> > DataMap;
А>> DataMap _data;
А>> for (DataMap::const_iterator iter = _data.begin(); iter != _data.end(); ++iter) {
А>> std::cout << (*iter->second).getValue() << std::endl;
А>> }
А>>
S>Если уж совсем надо, то что-то вроде этого. S>(Пусть getValue() возвращает string.)
S>
Правда для таких случаев лучше сделать обёртки вроде bind_second или second_iterator (что-бы избежать вложенного bind-а).
Да, еще этот вариант немного отличается от оригинала. В оригинал flush буффера происходит после записи каждого элемента. Здесь же не происходит вообще. Если надо — можно его добавить в конец.
Здравствуйте, <Аноним>, Вы писали:
А>привет всем. А>скажите пожалуйста, можно ли переписать нижеследующий код, применив std::for_each, и если да, то каким образом? А>
А> //выше имплементирован класс Entity
А> typedef std::map< std::string, boost::shared_ptr<Entity> > DataMap;
А> DataMap _data;
А> for (DataMap::const_iterator iter = _data.begin(); iter != _data.end(); ++iter) {
А> std::cout << (*iter->second).getValue() << std::endl;
А> }
А>
А можно вопрос "в лоб"?
Зачем в данном конкретном коде что либо менять? Только ради использования std::for_each? Так он не идеален и результат компиляции с очень высокой вероятностью будет хуже, чем у того кода, что есть сейчас.
Неужели подключение пары километров шаблонного кода даст результат лучше и читабельнее???
В жисть не поверю!