Ответы Mail.ru: Шаблонная функция, сложности с передачей указателя вектора.

Шаблонная функция, сложности с передачей указателя вектора.

Хотел попробовать передать в функцию указатель вектора по аналогии со многими STL функциями - когда просто пишешь array.begin() в параметрах без указания типа контейнера и типа его содержимого. Но оказалось не все так просто как на самом деле. template <class T> void foo (vector<T>::iterator begin) {} - не работает. Так и не понял, куда втуливать typename (как подсказывает IDE) чтобы можно было передавать указатель любого типа вектора. Как сделать шаблонную функцию, которая сама определяет тип итератора, который ей передаешься?

Лучший ответ

А взять для образца любую функцию stl и посмотреть задача со звездочкой ? template < class InputIterator, class T > T accumulate (InputIterator first, InputIterator last, T init) { while (first!=last) { init = init + *first; // or: init=binary_op(init,*first) for the binary_op version ++first; } return init; }

Остальные ответы

А польза-то в чём? Итератор без объекта внутри функции не нужен. А сам объект уже имеет собственный итератор.

 #include  
#include  
#include  
#include  
using namespace std; 
template 
void show(const Type& seq) { 
    for (const auto& item : seq) cout << item << ' '; 
    puts(""); 
} 
int main() { 
    list a{ 1, 2, 3, 4, 5 }; 
    show(a); 
    vector b{ 10, 20, 30, 40, 50 }; 
    show(b); 
    set c{ 100, 200, 300, 400, 500 }; 
    show(c); 
} 

1 год

Польза в одновременном задании диапазона, если не весь контейнер обрабатывать. Функции STL же как-то принимают именно два итератора, а не весь обьект, тот же sort. Вот как там реализовано?

1 год

Сергей Степанов, они же принимают итераторы объекта, а не объект итератора :)

1 год

Как-то так!

1 год

Сергей Степанов, ошибку у себя в коде заприметил. Нужно шаблон функции вот так переписать.

 template
void show(const RandomAccessIterator& begin, const RandomAccessIterator& end) {
    copy(begin, end, ostream_iterator(cout, " "));
    puts("");
}