迭代字符串的最优雅的方式

什么是迭代字符串的最优雅的方式? 该字符串可以被认为是由用空格分隔的单词组成的。

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

我用这个来分隔字符串。 第一个将结果放入一个预先构造的向量中,第二个返回一个新的向量。

#include <string>
#include <sstream>
#include <vector>
#include <iterator>

template<typename Out>
void split(const std::string &s, char delim, Out result) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, 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", ':');

使用Boost的可能解决方案可能是:

#include <boost/algorithm/string.hpp>
std::vector<std::string> strs;
boost::split(strs, "string to split", boost::is_any_of("t "));

这种方法可能比stringstream方法更快。 由于这是一个通用模板函数,因此可以使用各种分隔符来分割其他类型的字符串(wchar等或UTF-8)。

详情请参阅文档。

链接地址: http://www.djcxy.com/p/433.html

上一篇: The most elegant way to iterate the words of a string

下一篇: event.preventDefault() vs. return false