开发者

getline vs istream_iterator

开发者 https://www.devze.com 2022-12-11 14:22 出处:网络
Should there be a reason to pr开发者_如何学编程effer either getline or istream_iteratorif you are doing line by line input from a file(reading the line into a string, for tokenization).I sometimes (de

Should there be a reason to pr开发者_如何学编程effer either getline or istream_iterator if you are doing line by line input from a file(reading the line into a string, for tokenization).


I sometimes (depending on the situation) write a line class so I can use istream_iterator:

#include <string>
#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>

struct Line
{
    std::string lineData;

    operator std::string() const
    {
        return lineData;
    }
};
std::istream& operator>>(std::istream& str,Line& data)
{
    std::getline(str,data.lineData);
    return str;
}

int main()
{
     std::vector<std::string>    lines(std::istream_iterator<Line>(std::cin),
                                       std::istream_iterator<Line>());
}


getline will get you the entire line, whereas istream_iterator<std::string> will give you individual words (separated by whitespace).

Depends on what you are trying to accomplish, if you are asking which is better (tokenization is just one bit, e.g. if you are expecting a well formed program and you expect to interpret it, it may be better to read in entire lines...)


@Martin York's answer-- while works-- fails in many areas when used with STL's algorithm. A simpler solution is to use inheritance.

struct line : public std::string{
    using std::string::string;
};

std::istream& operator>>(std::istream& s, line& l){
    std::getline(s, l);
    return s;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消