2015-06-04 5 views
2

Вот мой код:Использование ostream_iterator на векторе указателей

std::vector<int*> osd; 
osd.push_back(new int(2)); 
osd.push_back(new int(3)); 

std::ostream_iterator<int*, char> out_iter2(std::cout, " "); 
copy(osd.begin(),osd.end(), out_iter2); 

выход: 0x8e6388 0x8e6a8

Как сделать итератор для печати фактических значений? Нужно ли мне специализироваться?

Я сделал специализированный оператор для него, но он все еще не работает

std::ostream& operator<<(std::ostream& os, const std::vector<int*>::iterator pd) 
{ 
    return os << *pd << std::endl; 
} 
+0

Ну, это довольно много, что 'ostream_iterator' должен делать - он использует' 'оператор <<. Почему вы используете 'vector ' вместо 'vector '? – Pradhan

+0

Ostream_iterator вызывает что-то вроде os << * iter (не os << iter) внутри, поэтому специализация xxxxx :: iterator здесь не полезна. – Sorayuki

ответ

3

Вы можете использовать std::transform с лямбда-выражения, которое получает фактическое значение от указателя, например:

std::ostream_iterator<int, char> out_iter2(std::cout, " "); 
std::transform(osd.begin(), 
       osd.end(), 
       out_iter2, 
       [] (int* x) { return *x; } 
      ); 

DEMO

EDIT

Вот возможная реализация изображения из указанной выше ссылке:

template<class InputIt, class OutputIt, class UnaryOperation> 
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, 
        UnaryOperation unary_op) 
{ 
    while (first1 != last1) { 
     *d_first++ = unary_op(*first1++); 
    } 
    return d_first; 
} 
+0

Вопрос: когда на самом деле называлось «преобразование»? –

+0

@CarloBrew Когда вам нужно сделать некоторое преобразование в элементе, а 'std :: copy' просто скопировать элементы в dest, без каких-либо изменений на них. – songyuanyao

+0

Хм, я все еще запутался, когда была функция, фактически «вызванная» из вашего кода. Вызывается ли это во время объявления 'transform'? –

Смежные вопросы