Алгоритм for_each и distance
Доброго времени суток, Уважаемые.
Требуется для всех элементов вектора выполнить функцию с указанием номера обрабатываемого элемента
Смысл такой
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
Здравствуйте, 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
Здравствуйте, _Paul, Вы писали:
_P> for_each(v.begin(), v.end(), _1 = (&_1 - &v[0]));
Это работает, но это некорректно брать адреса элементов контейнера.
Re[2]: Алгоритм for_each и distance
Здравствуйте, php-coder, Вы писали:
PC>Чем обычный for() не подошел?
Чуть-чуть узнать нового
Потом мне нравится функциональный стиль.
Re[2]: Алгоритм for_each и distance
Здравствуйте, _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
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>Требуется для всех элементов вектора выполнить функцию с указанием номера обрабатываемого элемента
Если так уж любишь извращения, попробуй zip_iterator поверх counting_iterator.
До последнего не верил в пирамиду Лебедева.
Re[2]: Алгоритм for_each и distance
Здравствуйте, Roman Odaisky, Вы писали:
RO>Если так уж любишь извращения, попробуй zip_iterator поверх counting_iterator.
Люблю простоту, и сделал как написал тов. php-coder : через for
В то же время, интересно было опопробовать и другие варианты
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить