我正在尝试使用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);
}
答案 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
从一个迭代器复制到另一个迭代器。但你不是从迭代器复制。你一次只插入一个元素,你可以通过解引用迭代器来做到这一点,好像它是一个指针,然后在你完成时递增它。