C++ 字符串分割
用过python语言的同学肯定知道,字符串split是一个非常好用的工具,但是很可惜的是C++并没有这样的函数((string, char) => vector<string>)
供我们调用
这里我们来说一下用流实现的方法
首先明确流是什么?
流是一个对象,他创建了目标与源的连接。流可以从源获取信息,或者向目标地提供信息
对输入流来说,主要从中提取一些东西 operator>>
对输出流来说,主要将某些东西压入其中 operator<<
C++有一个用于连接到字符串的流 std::istringstream
这个流有一个属性,他的operator>>
会生成一个到下一个空格的字符串
std::istream_iterator
是一个可以连接到输入流的迭代器
他提供基本的接口,*
用于获取输入的元素,++
用于获取下一个元素,++
运算符实际上是在从流中获取东西
我们使用istream_iterator<std::string>
用于从流中读取字符串
当流已经没有内容可以从源中提取的时候,他会向迭代器发出信号,迭代器会被标记为已完成
std::istream_iterator
的默认构造函数会将它标记为已完成的迭代器
我们要把结果储存到一个vector中,我们需要一个begin和一个end,两个迭代器用于标识结果的头和尾
那么begin就是输入迭代器的开始,即std::istream_iterator<std::string>(iss)
而end就是我们标记为已完成的迭代器,即std::istream_iterator<std::string>()
那么我们的代码就可以这样写
std::string text = "words need to split";
std::istringstream iss(text);
std::vector<std::string> result((std::istream_iterator<std::string>(iss)),
std::istream_iterator<std::string>());
或者这样
std::string text = "words need to split";
std::istringstream iss(text);
std::vector<std::string> result(std::istream_iterator<std::string>{iss},
std::istream_iterator<std::string>());
文章评论