Алгоритм for_each и distance
От: Alexander Pazdnikov  
Дата: 03.07.08 10:39
Оценка:
Доброго времени суток, Уважаемые.

Требуется для всех элементов вектора выполнить функцию с указанием номера обрабатываемого элемента

Смысл такой
void BinFunc(int elemNum, int elemVal)
{
    ....
}

vector<int> v(10)

for_each(v.begin(), v.end(),
    bind(BinFun, 
        bind(distance, v.begin(), _1)) + 1);


Где-то встречал подобное, но не могу найти, может приснилось
for_each(v.begin, v.end, _1 = distance(v.begin, _1));
Re: Алгоритм for_each и distance
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 03.07.08 10:43
Оценка: +2
Здравствуйте, Alexander Pazdnikov, Вы писали:

AP>Доброго времени суток, Уважаемые.


AP>Требуется для всех элементов вектора выполнить функцию с указанием номера обрабатываемого элемента


Чем обычный for() не подошел?
Re: Алгоритм for_each и distance
От: _Paul Россия  
Дата: 03.07.08 10:53
Оценка:
Здравствуйте, Alexander Pazdnikov, Вы писали:

AP>Требуется для всех элементов вектора выполнить функцию с указанием номера обрабатываемого элемента

Посмотри boost::lambda, можно например так написать:

#include <vector>
#include <algorithm>
using namespace std;

#include <boost/lambda/lambda.hpp>
using namespace boost::lambda;

int main()
{
  vector<int> v(10);
  for_each(v.begin(), v.end(), _1 = (&_1 - &v[0]));
  for_each(v.begin(), v.end(), cout << _1 << "\n");
}
Re[2]: Алгоритм for_each и distance
От: Alexander Pazdnikov  
Дата: 03.07.08 11:06
Оценка:
Здравствуйте, _Paul, Вы писали:
_P>  for_each(v.begin(), v.end(), _1 = (&_1 - &v[0]));

Это работает, но это некорректно брать адреса элементов контейнера.
Re[2]: Алгоритм for_each и distance
От: Alexander Pazdnikov  
Дата: 03.07.08 11:07
Оценка:
Здравствуйте, php-coder, Вы писали:

PC>Чем обычный for() не подошел?


Чуть-чуть узнать нового

Потом мне нравится функциональный стиль.
Re[2]: Алгоритм for_each и distance
От: Alexander Pazdnikov  
Дата: 03.07.08 11:34
Оценка:
Здравствуйте, _Paul, Вы писали:

_P>Здравствуйте, Alexander Pazdnikov, Вы писали:


AP>>Требуется для всех элементов вектора выполнить функцию с указанием номера обрабатываемого элемента

_P>Посмотри boost::lambda, можно например так написать:

Получилось через реализацию STL-алгоритма как две капли похож на std::transform

#include <vector>
#include <algorithm>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/iterator/counting_iterator.hpp>
#include <iostream>

using namespace std;
using namespace boost;
using namespace boost::lambda;

template<typename Inp1, typename Inp2, typename BinOp>
void perform(Inp1 first1, Inp1 last1, Inp2 first2, BinOp binop)
{
    for (; first1 != last1; ++first1, ++first2)
    {
        binop(*first1, *first2);
    }
}

void printFunc(int elemVal, int elemNum)
{
    cout << elemNum << " -> " << elemVal << endl;
}

int main(int argc, char **argv, char **env)
{
    vector<int> v1(10, 0);
    for_each(v1.begin(), v1.end(), cout << _1 << ", ");
    cout << endl;
    perform(v1.begin(), v1.end(), make_counting_iterator(1), printFunc);
}


Что можно подсунуть transform в качестве <выходного итератора> пустышки, т.к. результат обработки не нужен на выходе?
    transform(v.begin(), v.end(), make_counting_iterator(1), ???, printFunc);
Re[3]: Алгоритм for_each и distance
От: _Paul Россия  
Дата: 03.07.08 11:57
Оценка: +2
Здравствуйте, Alexander Pazdnikov, Вы писали:

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

AP>
_P>>  for_each(v.begin(), v.end(), _1 = (&_1 - &v[0]));
AP>

AP>Это работает, но это некорректно брать адреса элементов контейнера.

Для std::vector — корректно, стандарт гарантирует что элементы в памяти хранятся непрерывно (23.2.4.1: &v[n] == &v[0] + n)
Re: Алгоритм for_each и distance
От: Roman Odaisky Украина  
Дата: 03.07.08 17:35
Оценка: :)
Здравствуйте, Alexander Pazdnikov, Вы писали:

AP>Требуется для всех элементов вектора выполнить функцию с указанием номера обрабатываемого элемента


Если так уж любишь извращения, попробуй zip_iterator поверх counting_iterator.
До последнего не верил в пирамиду Лебедева.
Re[2]: Алгоритм for_each и distance
От: Alexander Pazdnikov  
Дата: 04.07.08 04:11
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Если так уж любишь извращения, попробуй zip_iterator поверх counting_iterator.


Люблю простоту, и сделал как написал тов. php-coder : через for

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