адаптер итератора, вызывающий фнуктор
От: gbt Россия  
Дата: 07.12.05 06:10
Оценка:
Реализован ли в 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


Нет ли чего такого ?
Re: адаптер итератора, вызывающий фнуктор
От: korzhik Россия  
Дата: 07.12.05 07:07
Оценка: 26 (2) +1
Здравствуйте, 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
Re: адаптер итератора, вызывающий фнуктор
От: korzhik Россия  
Дата: 07.12.05 07:09
Оценка:
Здравствуйте, 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
Re: адаптер итератора, вызывающий фнуктор
От: Bell Россия  
Дата: 07.12.05 07:20
Оценка: 24 (1)
Здравствуйте, 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;
}
Любите книгу — источник знаний (с) М.Горький
Re[2]: адаптер итератора, вызывающий фнуктор
От: gbt Россия  
Дата: 07.12.05 07:44
Оценка:
Здравствуйте, 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 в курсе. Тем не менее, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.