我有以下代码:
std::istream_iterator<std::string> eos;
std::istream_iterator<std::string> iit (File);
std::vector<std::string> result;
std::copy(iit,eos,std::back_inserter(result));
for(auto it=result.begin(); it!=result.end(); ++it )
std::cout << *it << std::endl;
我正在使用迭代器来读取File
的内容并将结果存储到我的向量中,我不想使用任何while
或for
循环,我我想只使用任何STL
函数来执行此操作,因此我尝试了copy
。该文件的内容采用以下形式:
Pork bone:4
Pigs trotters:4
Loin of pork:4
问题是前面的代码读取每一行直到空格或换行符,所以我的向量看起来像:
Pork
bone:4
Pigs
trotters:4
Loin
of
pork:4
我希望每一行都是我向量中的一个新元素,任何想法如何解决这个问题?
答案 0 :(得分:2)
看起来在How do I iterate over cin line by line in C++?
已经存在堆栈溢出的示例引用相关位:“
class line {
std::string data;
public:
friend std::istream &operator>>(std::istream &is, line &l) {
std::getline(is, l.data);
return is;
}
operator std::string() const { return data; }
};
例如,要将文件中的所有行读成字符串向量,可以使用以下内容:
std::vector<std::string> lines;
std::copy(std::istream_iterator<line>(std::cin),
std::istream_iterator<line>(),
std::back_inserter(lines));
” 免责声明:我自己没有尝试过这个,我只是基于他的声誉等信任Jerry Coffin。
答案 1 :(得分:1)
您可以创建自己的基于行的迭代器:
template<typename T>
class line_iterator
: public std::iterator<std::input_iterator_tag, T>
{
public:
typedef std::istream istream_type;
typedef T value_type;
line_iterator(istream_type& is) : ptr(&is) { getInput(); }
line_iterator() : ptr(nullptr) { }
T const& operator*() const
{
return value;
}
line_iterator& operator++()
{
getInput();
return *this;
}
T* operator->()
{
return &value;
}
line_iterator operator++(int)
{
line_iterator copy(*this);
++*this;
return copy;
}
friend bool operator==(const line_iterator& lhs, const line_iterator& rhs)
{
return lhs.ptr == rhs.ptr;
}
friend bool operator!=(const line_iterator& lhs, const line_iterator& rhs)
{
return !(lhs == rhs);
}
private:
T value;
istream_type* ptr;
void getInput()
{
if (ptr)
{
if (!std::getline(*ptr, value)) ptr = nullptr;
}
}
};
现在你可以做到:
std::copy(line_iterator<std::string>(File),
line_iterator<std::string>(), std::back_inserter(result));
答案 2 :(得分:0)
似乎除了使用std :: getline和相同的while循环之外别无他法。
答案 3 :(得分:0)
不是使用istream_iterator,最好的办法是使用istream :: getline函数。