一尘不染

如何迭代字符串的单词?

c++

我正在尝试遍历字符串的单词。

可以假定该字符串由由空格分隔的单词组成。

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

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


阅读 272

收藏
2022-01-18

共2个答案

一尘不染

我用它通过分隔符分割字符串。第一个将结果放入预先构建的向量中,第二个返回一个新向量。

#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", ':');
2022-01-18
一尘不染

值得一提的是,这是从输入字符串中提取标记的另一种方法,仅依赖于标准库设施。这是 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可以使用相同的通用算法将提取的标记插入到容器中,而不是将提取的标记复制到输出流中。

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>{}};
2022-01-18