在C ++中使用back_insert_iterator

时间:2012-09-23 21:18:44

标签: c++ iterator istream

我正在尝试使用C ++,并且应该实现该功能:

std::istream& readResults(std::istream& is, std::back_insert_iterator<std::vector<Result>> insertIt)

该函数从istream读取“studentId grade”形式的行,并应使用insertIt将它们添加到矢量类型。

结果是一个结构:

struct Result
{
  std::string studentId;
  size_t grade;
};

你能否告诉我如何开始?

我尝试过这样的事情:

std::string studentId;
size_t grade;
Result new_result;

while(is >> studentId >> grade) {
    Result new_result = {studentId, grade};
    copy(new_result, *insertIt);
    }

3 个答案:

答案 0 :(得分:3)

std :: back_insert_iterator直接使用真的很麻烦。使用模板函数std :: back_inserter(它为您完成所有模板参数推断)。

你的readResults会变成这样:

std::copy(std::istream_iterator<Result>(is), std::istream_iterator<Result>(), std::back_inserter(v));

如果您有重载运算符&gt;&gt;为结果。

答案 1 :(得分:1)

您想为Result创建一个读取函数,即声明如下的内容:

std::istream& operator>> (std::istream& in, Result& result)
{
    // read your result here
    return in;
}

有了这个,readResult()的实施变得相当直接:

std::copy(std::istream_iterator<Result>(is), std::istream_iterator<Result>(), insertIt);

除此之外,您只需使用合适的迭代器调用readResult()函数。

答案 2 :(得分:1)

您不想实现该功能

std::istream& readResults(
    std::istream& is,
    std::back_insert_iterator<std::vector<Result>> insertIt)

您要做的是改为实现模板功能

template<class InsertIterator>
std::istream& readResults(std::istream& is, InsertIterator insertIt)

当您传递std::back_inserter(vec)时,模板将自动实例化为正确的类型。

此功能的代码基本上是

template<class InsertIterator>
std::istream& readResults(std::istream& is, InsertIterator insertIt) {
  std::string studentId;
  size_t grade;
  while (is >> studentId >> grade) {
    Result new_result = {studentId, grade};
    *(insertIt++) = new_result;
  }
}

std::copy从一个迭代器复制到另一个迭代器。但你不是从迭代器复制。你一次只插入一个元素,你可以通过解引用迭代器来做到这一点,好像它是一个指针,然后在你完成时递增它。