【发布时间】:2011-07-27 05:33:49
【问题描述】:
我在 StackOverflow 上研究了一些时间,以找到将具有多个分隔符的字符串拆分为 vector< string > 的良好算法。我也找到了一些方法:
升压方式:
boost::split(vector, string, boost::is_any_of(" \t"));
getline 方法:
std::stringstream ss(string);
std::string item;
while(std::getline(ss, item, ' ')) {
vector.push_back(item);
}
Boost的tokenize方式:
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));
以及Shadow2531的方法(见链接主题)。
大部分来自this topic。但不幸的是,他们并没有解决我的问题:
Boost 的拆分很容易使用,但是对于大数据(在最佳情况下大约 1.5*10^6 个单个元素)和大约 10 个分隔符,我使用它的速度非常慢。
getline、STL 和 Shadow2531 的方法存在我只能使用一个字符作为分隔符的问题。我还需要一些。Boost 的标记化在速度方面更加可怕。用 10 个分隔符将一个字符串拆分为 1.5*10^6 个元素需要 11 秒。
所以我不知道该怎么办:我想要一个非常快速的字符串拆分算法,带有多个分隔符。
Boost 的拆分是最大的还是有办法更快?
【问题讨论】:
-
你试过多线程吗?例如,将您的 delim 分成 N 组,并为每个组运行一个线程以按该 delim 组拆分字符串并填充一个列表,然后重新组合列表?
-
一定有更快的方法。这:
cat loremipsum_big.txt | ruby -e "ary = Array.new; ARGF.each {|x| ary << x.split(/a| /)}; puts ary" | wc -l创建 2.516.715 个元素,在 Virtualboxed Ubuntu 中在 3.74 秒内将它们推送到一个数组中。 -
以下文章中的一些示例怎么样:codeproject.com/KB/recipes/Tokenizer.aspx 它们非常有效。字符串工具包库使 C++ 中的复杂字符串处理变得简单易行。
标签: c++ string boost split performance