запустить чужую функцию для каждого элемента вектора
От: Пандочка  
Дата: 31.10.07 00:19
Оценка:
Здрастуйте здесь.

У меня несложный вопрос, ответ на который, вероятно, даст мне понять, как все-таки все (или почти все) устроено.
У меня есть вектор с wstring.
std::vector<std::wstring> v;

Заполненный всякой всяченой. Как красивее всего будет запустить для каждого элемента вектора функцию, принимающую в качестве параметра не wstring, а LPWCSTR.
void foo(LPCWSTR a);

Конечно, ничего не стоит сделать нечто вроде:
void yahoo(std::wstring a)
{ 
   LPCWSTR l = a.c_str();
   ...
}

std::for_each(v.begin(), v.end(), yahoo);

Но создавать функции — ограничение.
Хочется что-то вроде static_cast<vector<LPCWSTR>>(v) (это, конечно, ересь).
Как это правильно и красиво сделать?
Re: запустить чужую функцию для каждого элемента вектора
От: jazzer Россия Skype: enerjazzer
Дата: 31.10.07 01:35
Оценка:
Здравствуйте, Пандочка, Вы писали:

П>У меня есть вектор с wstring.

П>
П>std::vector<std::wstring> v;
П>

П>
П>void foo(LPCWSTR a);
П>


П>Хочется что-то вроде static_cast<vector<LPCWSTR>>(v) (это, конечно, ересь).

П>Как это правильно и красиво сделать?

Наверное, что-нть вроде (не компилировал, просто навскидку)
#include <boost/bind.hpp>

void f()
{
  using namespace boost;
  std::for_each(v.begin(), v.end(),
                bind( foo,
                      bind(&std::wstring::c_str, _1)
  ));
}


Еще в бусте есть transform_iterator — можно сделать так, чтобы у тебя итерация сразу шла по x.c_str()
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: запустить чужую функцию для каждого элемента вектора
От: shrecher  
Дата: 31.10.07 13:55
Оценка: 1 (1) +1
Здравствуйте, Пандочка, Вы писали:

П>Как это правильно и красиво сделать?



std::vector<std::wstring> v;
for( unsigned int nItem=0; nItem=v.size(); nItem++)
{
        yahoo( v[nItem] );
}
Re[2]: запустить чужую функцию для каждого элемента вектора
От: shrecher  
Дата: 31.10.07 13:59
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Здравствуйте, Пандочка, Вы писали:


П>>Как это правильно и красиво сделать?



S>
S>std::vector<std::wstring> v;
S>for( unsigned int nItem=0; nItem=v.size(); nItem++)
S>{
S>        yahoo( v[nItem] );
S>}
S>


конечно, всегда можно написать
        yahoo( v[nItem].c_str() );
Re[3]: запустить чужую функцию для каждого элемента вектора
От: Пандочка  
Дата: 31.10.07 14:35
Оценка:
Здравствуйте, shrecher, Вы писали:

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


S>>Здравствуйте, Пандочка, Вы писали:


П>>>Как это правильно и красиво сделать?



S>>
S>>std::vector<std::wstring> v;
S>>for( unsigned int nItem=0; nItem=v.size(); nItem++)
S>>{
S>>        yahoo( v[nItem] );
S>>}
S>>


S>конечно, всегда можно написать

S>
S>        yahoo( v[nItem].c_str() );
S>


это первое, что пришло мне в голову.
однако не хочется пользоваться циклом, хочется понять, существуют ли вообще такое явление в природе, которое позволило бы не только запустить некоторый метод у каждого элемента контейнера (mem_fun_ref(wstring::c_str) как унарный предикат), но и получить возвращаемое значение, которое и запихнуть в предикат, вместо элемента.
Re[4]: запустить чужую функцию для каждого элемента вектора
От: Roman Odaisky Украина  
Дата: 31.10.07 17:48
Оценка:
Здравствуйте, Пандочка, Вы писали:

П>однако не хочется пользоваться циклом, хочется понять, существуют ли вообще такое явление в природе, которое позволило бы не только запустить некоторый метод у каждого элемента контейнера (mem_fun_ref(wstring::c_str) как унарный предикат), но и получить возвращаемое значение, которое и запихнуть в предикат, вместо элемента.


Есть, Boost.Bind.

Но циклы рулят.
До последнего не верил в пирамиду Лебедева.
Re[4]: запустить чужую функцию для каждого элемента вектора
От: _Dreamer Россия  
Дата: 01.11.07 03:38
Оценка:
Здравствуйте, Пандочка, Вы писали:

П>это первое, что пришло мне в голову.

П>однако не хочется пользоваться циклом, хочется понять, существуют ли вообще такое явление в природе, которое позволило бы не только запустить некоторый метод у каждого элемента контейнера (mem_fun_ref(wstring::c_str) как унарный предикат), но и получить возвращаемое значение, которое и запихнуть в предикат, вместо элемента.

в стандарте — нет.
есть в реализации STL от SGI, здесь.
так же описано у Джосьютиса, здесь.
про буст уже многие сказали.
Re[5]: запустить чужую функцию для каждого элемента вектора
От: Sergey Chadov Россия  
Дата: 01.11.07 16:32
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Есть, Boost.Bind.

RO> Но циклы рулят.

Кстати, далеко не всегда. Часто читать код, в котором одно действие("операция над вектором") выполняется одним выражением, бывыет значительно проще, особенно, если программист не забывает писать комментарии.
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[6]: запустить чужую функцию для каждого элемента вектора
От: Пандочка  
Дата: 01.11.07 19:06
Оценка: +1
Здравствуйте, Sergey Chadov, Вы писали:

SC>Здравствуйте, Roman Odaisky, Вы писали:


RO>>Есть, Boost.Bind.

RO>> Но циклы рулят.

SC>Кстати, далеко не всегда. Часто читать код, в котором одно действие("операция над вектором") выполняется одним выражением, бывыет значительно проще, особенно, если программист не забывает писать комментарии.


вот я и пытаюсь понять, что удобночитаемее и удобнее.
просто цикл или вызов алгритма с адаптером.
со сложными и повторяющимися констукрциями все понятно — выношу в функтор, а с такими простыми, думаю, лучше все-таки через Bind, если есть возможность исользовать boost
Re[2]: запустить чужую функцию для каждого элемента вектора
От: johny5 Новая Зеландия
Дата: 02.11.07 08:40
Оценка:
S>
S>std::vector<std::wstring> v;
S>for( unsigned int nItem=0; nItem=v.size(); nItem++)
S>{
S>        yahoo( v[nItem] );
S>}
S>




#define foreach BOOST_FOREACH


std::vector<std::wstring> v;
foreach( std::wstring& item, v )
{
        yahoo( item.c_str() );
}


 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.