我在StackOverflow上调查了一些时间,寻找将带有多个分隔符的字符串拆分成
Boost方法:
Boost的分词方式:
vector< string >
的好算法。我还找到了一些方法:Boost方法:
boost::split(vector, string, boost::is_any_of(" \t"));
the getline
method:
std::stringstream ss(string);
std::string item;
while(std::getline(ss, item, ' ')) {
vector.push_back(item);
}
Boost的分词方式:
char_separator<char> sep(" \t");
tokenizer<char_separator<char>> tokens(string, sep);
BOOST_FOREACH(string t, tokens)
{
vector.push_back(t);
}
还有一种很酷的STL方式:
istringstream iss(string);
copy(istream_iterator<string>(iss),
istream_iterator<string>(),
back_inserter<vector<string> >(vector));
这些方法大多来自于此主题,但是很遗憾它们都不能解决我的问题:
Boost的split使用简单,但在处理大数据(最好情况下约1.5*10^6个单独元素)和使用约10个分隔符时,速度非常慢。
getline、STL和Shadow2531的方法存在一个问题,即我只能使用一个单一字符作为分隔符,而我需要更多。
Boost的tokenize在速度方面更加缓慢。使用10个分隔符将字符串拆分成1.5*10^6个元素需要11秒钟。
所以我不知道该怎么办:我想要一个真正快速的字符串拆分算法,并且可以使用多个分隔符。
Boost的split是否已达到极限?还是有更快的方法?
注:请保留HTML标签。
cat loremipsum_big.txt | ruby -e "ary = Array.new; ARGF.each {|x| ary << x.split(/a| /)}; puts ary" | wc -l
在虚拟化的 Ubuntu 上仅用了3.74秒就创建了2,516,715个元素,并将它们推入了一个数组中。 - karatedog