Ответ 1
Я не могу представить, какие ошибки может возникнуть у этого человека, и вы должны попросить их объяснить. Ничто не может пойти не так, как ошибки распределения, как вы упомянули, которые выбрасываются и не проглатываются.
Единственное, что я вижу, что вы просто отсутствуете, - это то, что ss.fail()
гарантированно будет истинным после цикла while, поскольку это условие проверяется. (bool(stream)
эквивалентно !stream.fail()
, а не stream.good()
.) Как и ожидалось, ss.eof()
также будет истинным, что указывает на отказ из-за EOF.
Однако может возникнуть некоторая путаница в том, что происходит на самом деле. Поскольку getline использует поля delim- terminated, а не delim- разделенные поля, входные данные, такие как "a\nb\n"
, имеют два вместо трех полей, и это может быть неожиданным. Для строк это имеет смысл (и является стандартом POSIX), но сколько полей с разделителем '-'
вы ожидаете найти в "a-b-"
после разделения?
Кстати, вот как я написал split
template<class OutIter>
OutIter split(std::string const& s, char delim, OutIter dest) {
std::string::size_type begin = 0, end;
while ((end = s.find(delim, begin)) != s.npos) {
*dest++ = s.substr(begin, end - begin);
begin = end + 1;
}
*dest++ = s.substr(begin);
return dest;
}
Это позволяет избежать всех проблем с iostreams, в первую очередь, позволяет избежать дополнительных копий (строка поддержки строкового потока, а также временная ссылка, возвращаемая substr, может даже использовать ссылку rvalue С++ для семантики перемещения, если она поддерживается, как написано), имеет поведение, которое я ожидаю от split (отличается от вашего), и работает с любым контейнером.
deque<string> c;
split("a-b-", '-', back_inserter(c));
// c == {"a", "b", ""}