声明一个接受泛型迭代器的函数

时间:2011-02-19 23:01:15

标签: c++ iterator

鉴于此代码,是否可以更改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 个答案:

答案 0 :(得分:21)

创建模板

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

该模板还将容器值类型的限制删除为字符串。请注意,你需要围绕它的括号++。

答案 1 :(得分:12)

答案 2 :(得分:2)

我认为没有任何你想要的简单。理想情况下,您可以执行类似

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

但是STL迭代器似乎没有任何继承层次结构,令人恼火。所以看起来你仍然坚持使用function templates - 这就是在STL Algorithms Library中完成的。

抱歉 - 我希望有更好的方法,但这必须要做。只记得在头文件中声明完整的函数模板!

答案 3 :(得分:-1)

请尝试这个,这适用于所有容器:

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

注意:不要忘记包含&lt; 字符串&gt;,
      并且c ++ 11中提供了auto。