我正在尝试遍历字符串的单词。
可以假定该字符串由由空格分隔的单词组成。
请注意,我对 C 字符串函数或那种字符操作/访问不感兴趣。另外,请在您的回答中优先考虑优雅而不是效率。
我现在最好的解决方案是:
#include <iostream> #include <sstream> #include <string> using namespace std; int main() { string s = "Somewhere down the road"; istringstream iss(s); do { string subs; iss >> subs; cout << "Substring: " << subs << endl; } while (iss); }
有没有更优雅的方法来做到这一点?
我用它通过分隔符分割字符串。第一个将结果放入预先构建的向量中,第二个返回一个新向量。
#include <string> #include <sstream> #include <vector> #include <iterator> template <typename Out> void split(const std::string &s, char delim, Out result) { std::istringstream iss(s); std::string item; while (std::getline(iss, item, delim)) { *result++ = item; } } std::vector<std::string> split(const std::string &s, char delim) { std::vector<std::string> elems; split(s, delim, std::back_inserter(elems)); return elems; }
请注意,此解决方案不会跳过空标记,因此以下将找到 4 项,其中一项为空:
std::vector<std::string> x = split("one:two::three", ':');
值得一提的是,这是从输入字符串中提取标记的另一种方法,仅依赖于标准库设施。这是 STL 设计背后的力量和优雅的一个例子。
#include <iostream> #include <string> #include <sstream> #include <algorithm> #include <iterator> int main() { using namespace std; string sentence = "And I feel fine..."; istringstream iss(sentence); copy(istream_iterator<string>(iss), istream_iterator<string>(), ostream_iterator<string>(cout, "\n")); }
copy可以使用相同的通用算法将提取的标记插入到容器中,而不是将提取的标记复制到输出流中。
copy
vector<string> tokens; copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(tokens));
…或vector直接创建:
vector
vector<string> tokens{istream_iterator<string>{iss}, istream_iterator<string>{}};