问题

我正在尝试迭代字符串的单词.

这个字符串可以假设是由用空格分隔的单词组成的。

请注意,我对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);
}
 

有没有更优雅的方法来做到这一点?

  最佳答案

对于它的价值,这是从输入字符串中提取令牌的另一种方法,仅仅依赖于标准的库设施,这是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, "
"));
}
 

不要将提取的令牌复制到输出流中,而是可以使用相同的通用 copy 算法将它们插入容器中。

 vector<string> tokens;
copy(istream_iterator<string>(iss),
     istream_iterator<string>(),
     back_inserter(tokens));
 

...或直接创建vector:

 vector<string> tokens{istream_iterator<string>{iss},
                      istream_iterator<string>{}};
 

  相同标签的其他问题

c++stringsplit