【问题标题】:Declare a function accepting generic iterator声明一个接受泛型迭代器的函数
【发布时间】:2011-06-30 13:24:12
【问题描述】:

鉴于此代码,是否可以更改 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;
}

【问题讨论】:

  • 为什么还要限制为字符串? template &lt;typename Iterator&gt; dump(Iterator first, Iterator last); 怎么样?
  • 这只是一个例子。我有一些消耗字符串并且只消耗字符串的东西。我不想允许任何其他类型的项目。

标签: c++ iterator


【解决方案1】:

创建模板

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

模板还取消了容器值类型对字符串的限制。请注意,您需要在 it++ 周围加上括号。

【讨论】:

  • 虽然我认为这是最好的解决方案,但这并不是他问题的答案。 (你至少应该用“为什么限制字符串?”或其他东西来限定你的答案,以明确你正在走一条不太具体的路线。)
【解决方案2】:

【讨论】:

  • 谢谢。看起来它最接近我想要的。我有点复杂,我希望坚强。
  • 仅供参考,现在可以在 C++11 中使用 std::is_same。
  • 好的,但是如何使用构造函数呢?没有返回类型可以提供给元程序。明确一点:我希望构造函数是模板函数,但类是非模板类。
【解决方案3】:

我认为没有你想要的那么简单。理想情况下,你可以做类似的事情

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

但是 STL 迭代器似乎没有任何继承层次结构,这很烦人。所以看起来你一直坚持使用 function templates - 这就是在 STL Algorithms Library 中完成的方式。

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

【讨论】:

    【解决方案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);
    

    注意:不要忘记包含字符串>,
    并且 auto 在 c++ 11 中可用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 2017-05-10
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多