std :: find无法使用istream_iterators

时间:2015-10-21 15:28:37

标签: c++ iterator

我正在尝试使用std::istream_iterator<std::string>std::find范围内找到一个元素。代码无法编译,吐出有关模板类型扣除失败的错误

  

错误:没有匹配函数来调用&#39; find(std :: istream_iterator&gt;&amp;,std :: istream_iterator&gt;&amp;,std :: __ cxx11 :: string&amp;)&#39;        auto it = std :: find(is,end,token);

     

注意:候选人:模板typename __gnu_cxx :: __ enable_if :: __ value,std :: istreambuf_iterator&lt; _CharT&gt; &gt; :: __ type std :: find(std :: istreambuf_iterator&lt; _CharT&gt;,std :: istreambuf_iterator&lt; _CharT&gt;,const _CharT2&amp;)        find(istreambuf_iterator&lt; _CharT&gt; __ first,

     

注意:模板参数扣除/替换失败:

但是,使用the implementation of std::find from cppreference(简单的实现)可以使代码可编辑:

#include <iostream>
#include <iterator>
#include <sstream>

// implementation of std::find from cppreference.com
template<class InputIt, class T>
InputIt find(InputIt first, InputIt last, const T& value)
{
    for (; first != last; ++first) {
        if (*first == value) {
            return first;
        }
    }
    return last;
}

int main() 
{
    std::istringstream ss("this is a test");
    std::istream_iterator<std::string> is(ss);
    std::istream_iterator<std::string> end;

    std::string token = "test";
    auto it = find(is, end, token); // put std::find here and it won't compile
    (it != end) ? std::cout << "Found\n" : std::cout << "Not found\n";
}

有人知道std::findistream_iterator的错误吗?我虽然对std::find的要求非常基本:迭代器应该是一个InputIterator,istream_iterator是。

1 个答案:

答案 0 :(得分:7)

  

没有匹配功能可以拨打&#39;查找&#39;

确实,确实。您输入以下内容未将std::find带入范围:

#include <algorithm>