迭代字符串的最优雅的方式
什么是迭代字符串的最优雅的方式? 该字符串可以被认为是由用空格分隔的单词组成的。
请注意,我对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