укажите с for_each
От: Аноним  
Дата: 16.06.08 20:48
Оценка:
привет всем.
скажите пожалуйста, можно ли переписать нижеследующий код, применив 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;
        }
Re: укажите с for_each
От: Alexander G Украина  
Дата: 16.06.08 21:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>привет всем.

А>скажите пожалуйста, можно ли переписать нижеследующий код, применив 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.

Но я бы оставил как есть.
Русский военный корабль идёт ко дну!
Re: укажите с for_each
От: jazzer Россия Skype: enerjazzer
Дата: 17.06.08 02:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>привет всем.

А>скажите пожалуйста, можно ли переписать нижеследующий код, применив 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, хоть лямбды...
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: укажите с for_each
От: Smal Россия  
Дата: 17.06.08 06:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>привет всем.

А>скажите пожалуйста, можно ли переписать нижеследующий код, применив 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)));
С уважением, Александр
Re[2]: укажите с for_each
От: Smal Россия  
Дата: 17.06.08 06:18
Оценка:
Здравствуйте, 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>
S>   using boost::bind;
S>   std::transform(_data.begin(), _data.end(), std::ostream_iterator<std::string>(std::cout, "\n"),
S>                   bind(&Entity::getValue, bind(&DataMap::value_type::second, _1)));
S>


Правда для таких случаев лучше сделать обёртки вроде bind_second или second_iterator (что-бы избежать вложенного bind-а).

Да, еще этот вариант немного отличается от оригинала. В оригинал flush буффера происходит после записи каждого элемента. Здесь же не происходит вообще. Если надо — можно его добавить в конец.
С уважением, Александр
Re[2]: укажите с for_each
От: Vamp Россия  
Дата: 18.06.08 17:45
Оценка:
J>Ну...
По-моему, это живой пример к нашему недавнему обсуждению.
Да здравствует мыло душистое и веревка пушистая.
Re: укажите с for_each
От: CreatorCray  
Дата: 18.06.08 22:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>привет всем.

А>скажите пожалуйста, можно ли переписать нижеследующий код, применив 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? Так он не идеален и результат компиляции с очень высокой вероятностью будет хуже, чем у того кода, что есть сейчас.
Неужели подключение пары километров шаблонного кода даст результат лучше и читабельнее???
В жисть не поверю!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: укажите с for_each
От: jazzer Россия Skype: enerjazzer
Дата: 19.06.08 10:50
Оценка:
Здравствуйте, Vamp, Вы писали:

J>>Ну...

V>По-моему, это живой пример к нашему недавнему обсуждению.

развернешь мысль?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.