Объявите функцию, принимающую универсальный итератор - PullRequest
19 голосов
/ 20 февраля 2011

Учитывая этот код, можно ли изменить dumpStrings(), чтобы иметь возможность перебирать любой контейнер string, как, скажем, 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;
}

Ответы [ 4 ]

23 голосов
/ 20 февраля 2011

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

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

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

12 голосов
/ 20 февраля 2011
2 голосов
/ 20 февраля 2011

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

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

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

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

0 голосов
/ 01 августа 2016

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

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);

Примечание: не забудьте включить <<strong> string >,
И auto доступен в c ++11

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...