Реализован ли в boost'е или в Loki адаптер итереатора, вызывающий для каждого итерируемого элемента функтор (например, позволяющий обращаться только к определенному члену итерируемого элемента) и возвращающий результат ?
Хочется использовать следующим образом:
using namespace boost;
using namespace std;
vector<pair<int, string> > array;
array.push_back(make_pair(1, "test1"));
array.push_back(make_pair(2, "test2"));
copy(functor_iterator(array.begin(), mem_fn(&pair<int, string>::first)), functor_iterator(array.end(), mem_fn(&pair<int, string>::first)), ostream_iterator<int>(cout, " ")); // Выведет 1 2
copy(functor_iterator(array.begin(), mem_fn(&pair<int, string>::second)), functor_iterator(array.end(), mem_fn(&pair<int, string>::second)), ostream_iterator<string>(cout, " ")); // Выведет test1 test2
Нет ли чего такого ?
Здравствуйте, gbt, Вы писали:
gbt>Реализован ли в boost'е или в Loki адаптер итереатора, вызывающий для каждого итерируемого элемента функтор (например, позволяющий обращаться только к определенному члену итерируемого элемента) и возвращающий результат ?
gbt>Хочется использовать следующим образом:
gbt>gbt>using namespace boost;
gbt>using namespace std;
gbt>vector<pair<int, string> > array;
gbt>array.push_back(make_pair(1, "test1"));
gbt>array.push_back(make_pair(2, "test2"));
gbt>copy(functor_iterator(array.begin(), mem_fn(&pair<int, string>::first)), functor_iterator(array.end(), mem_fn(&pair<int, string>::first)), ostream_iterator<int>(cout, " ")); // Выведет 1 2
gbt>copy(functor_iterator(array.begin(), mem_fn(&pair<int, string>::second)), functor_iterator(array.end(), mem_fn(&pair<int, string>::second)), ostream_iterator<string>(cout, " ")); // Выведет test1 test2
gbt>
gbt>Нет ли чего такого ?
Transform Iterator
Здравствуйте, gbt, Вы писали:
gbt>Реализован ли в boost'е или в Loki адаптер итереатора, вызывающий для каждого итерируемого элемента функтор (например, позволяющий обращаться только к определенному члену итерируемого элемента) и возвращающий результат ?
gbt>Хочется использовать следующим образом:
gbt>gbt>using namespace boost;
gbt>using namespace std;
gbt>vector<pair<int, string> > array;
gbt>array.push_back(make_pair(1, "test1"));
gbt>array.push_back(make_pair(2, "test2"));
gbt>copy(functor_iterator(array.begin(), mem_fn(&pair<int, string>::first)), functor_iterator(array.end(), mem_fn(&pair<int, string>::first)), ostream_iterator<int>(cout, " ")); // Выведет 1 2
gbt>copy(functor_iterator(array.begin(), mem_fn(&pair<int, string>::second)), functor_iterator(array.end(), mem_fn(&pair<int, string>::second)), ostream_iterator<string>(cout, " ")); // Выведет test1 test2
gbt>
gbt>Нет ли чего такого ?
под конкретно эту задачу, заточен
вот такой итераторАвтор: MaximE
Дата: 20.10.04
Здравствуйте, gbt, Вы писали:
...
gbt>Нет ли чего такого ?
int main()
{
typedef pair<int, string> my_pair;
vector<my_pair > array;
array.push_back(make_pair(1, "test1"));
array.push_back(make_pair(2, "test2"));
//В STLPort есть 2 селектора - select1st и select2nd
transform(array.begin(), array.end(), ostream_iterator<int>(cout, "\n"),
select1st<my_pair>());
//Гораздо более общее решение с использованием boost::lambda
namespace bl = boost::lambda;
transform(array.begin(), array.end(), ostream_iterator<int>(cout, "\n"),
bl::bind(&my_pair::first, bl::_1));
return 0;
}
Здравствуйте, Bell, Вы писали:
gbt>>Нет ли чего такого ?
B> //В STLPort есть 2 селектора - select1st и select2nd
B> transform(array.begin(), array.end(), ostream_iterator<int>(cout, "\n"),
B> select1st<my_pair>());
B> //Гораздо более общее решение с использованием boost::lambda
B> namespace bl = boost::lambda;
B> transform(array.begin(), array.end(), ostream_iterator<int>(cout, "\n"),
B> bl::bind(&my_pair::first, bl::_1));
B>
К сожалению, нужно именно адаптеры итераторов, для того, чтобы их можно было выдавать пользователю. Насчет booost::bind b boost::lambda в курсе. Тем не менее, спасибо.