Объявить функцию, принимающую общий итератор

С учетом этого кода можно изменить dumpStrings(), чтобы иметь возможность перебирать любой контейнер string, например say a list<string>?

#include <vector>
#include <string>
#include <ostream>
#include <iostream>

using namespace std;

void dumpStrings(vector<string>::iterator it, vector<string>::iterator end)
{
    while (it != end) {
        cout << *it++ << endl;
    }
}

int main()
{
    vector<string> strVector;
    strVector.push_back("Hello");
    strVector.push_back("World");

    dumpStrings(strVector.begin(), strVector.end());
    return 0;
}

Ответы

Ответ 2

Создать шаблон

template<class iterator_type>
void dumpStrings(iterator_type it, iterator_type end)
{
    while (it != end) {
        cout << *(it++) << endl;
    }
}

Шаблон также удаляет предел типа значения контейнера в строку. Обратите внимание, что вам нужны скобки вокруг него ++.

Ответ 3

Я не думаю, что вам будет так просто, как хотелось бы. В идеале вы могли бы просто сделать что-то вроде

void dumpStrings(AbstractIterator<string> beg, AbstractIterator<string> end) { }

но итераторы STL, похоже, не имеют иерархии наследования, достаточно раздражающе. Таким образом, похоже, что вы застряли в использовании шаблонов функций - как это делается в Библиотека алгоритмов STL.

Извините - мне жаль, что не было лучшего способа, но это нужно будет сделать. Не забудьте объявить полный шаблон функции в файле заголовка!

Ответ 4

Попробуйте это, это будет работать во всех контейнерах:

template<class T>
void disp(T &t)
{
    for( auto itr=t.begin();itr!=t.end();itr++)
        cout<<*itr<<endl;
}

.cpp
    vector<int> v(3,77);
    list<string> l(5,"Hello");
    disp(l)
    disp(v);

Примечание. Не забудьте указать строку ,
    И авто доступно в С++ 11