使用流迭代器初始化向量

时间:2009-08-29 05:10:48

标签: c++ iterator

我正在尝试使用迭代器初始化一个向量,并且我得到一个编译器错误,基本上说没有匹配的函数可以调用。

代码从带有istream_iterator的文件中读取,并以输入的sentinel结束。然后我尝试用这两个迭代器初始化向量。

#include "std_lib_facilities.h"
#include<iterator>

int main()
{
    string from, to;    // get source and target file names
    cin >> from >> to;

    ifstream is(from.c_str()); // open input stream
    ofstream os(to.c_str());   // open output stream

    istream_iterator<string> ii(is);    // make input iterator for stream
    istream_iterator<string> eos;   // input sentinel
    ostream_iterator<string> oo(os,"\n");

    vector<string> words(ii, eos);  // vector initialized from input
    sort(words.begin(), words.end());   // sort the buffer
    copy(words.begin(), words.end(), oo);  // copy buffer to output
}

我知道我可以使用复制功能将输入流复制到矢量中,但我读到它也可以这样做。任何人都可以解释为什么这不是编译?感谢。

编译错误:

C:\Users\Alex\C++\stream_iterators.cpp|16|error: no matching function for call to `Vector<String>::Vector(std::istream_iterator<String, char, std::char_traits<char>, ptrdiff_t>&, std::istream_iterator<String, char, std::char_traits<char>, ptrdiff_t>&)'|

编辑:这不是标题问题。 Std_lib_facilities具有所有必需的标题。

4 个答案:

答案 0 :(得分:1)

vector<string> words(ii, eos);

的类似物
vector<string> words;
copy( ii, eos, back_inserter(words) );

vector类具有以下构造函数:

// initialize with range [First, Last)
template<class InputIterator>
   vector(
      InputIterator First,
      InputIterator Last
   );

要进行样本编译,您需要包含以下内容:

#include <sstream>
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm> // for std::copy

由于您的标识符不完全合格,您应添加以下内容:

using namespace std;

或完全限定所有STL标识符。

要改变,我猜,

copy(words.begin(), words.end(), out)

copy(words.begin(), words.end(), oo)

答案 1 :(得分:0)

请复制并粘贴编译器错误。此外,您缺少一些标题,如算法和向量。您需要使用命名空间std声明或使用std ::来访问STL类。

一旦您提供了更多信息,我们可以为您提供更多建议。

更新:为什么您的错误消息引用“Vector”(带有大写字母),而不是vector(小写)?

答案 2 :(得分:0)

书籍标题存在某种合规性问题,所以我只是包含了相应的标题,并且它有效。

答案 3 :(得分:0)

std_lib_facilities.h中的Vector类定义了三个构造函数,但没有一个接受一对迭代器的构造函数。您可以继续将其添加到标题中:

template <class Iter>
Vector(Iter from, Iter to): std::vector<T>(from, to) {}

使用此标题,您需要考虑这是手持式。真正的std :: vector中的operator []不应该进行范围检查。 (为什么不教导初学者使用vector :: at,直到他们认为最好留在边界......?)