Using back_insert_iterator in C++
c++, istream, iterator
Solution
You don't want to implement the function
std::istream& readResults(
std::istream& is,
std::back_insert_iterator<std::vector<Result>> insertIt)
What you want to do is instead implement the template function
template<class InsertIterator>
std::istream& readResults(std::istream& is, InsertIterator insertIt)
When you pass `std::back_inserter(vec)`, the template will automatically be instantiated to the right type.
The code for this function will essentially be
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` copies from one iterator to another. But you're not copying from an iterator. You're inserting elements one at a time, and you do this by dereferencing the iterator, as though it's a pointer, and then incrementing it when you're done.
Problem
I'm trying to get started with C++, and should implement the function: ``` std::istream& readResults(std::istream& is, std::back_insert_iterator<std::vector<Result>> insertIt) ``` The function reads lines of the form "studentId grade" from istream and should add them to a vector type using insertIt. Result is a struct with: ``` struct Result { std::string studentId; size_t grade; }; ``` Can you give me a hint on how to get started? I have tried something like this: ``` std::string studentId; size_t grade; Result new_result; while(is >> studentId >> grade) { Result new_result = {studentId, grade}; copy(new_result, *insertIt); } ```