使用单个字符或仅一个字符串来提升拆分
Posted
技术标签:
【中文标题】使用单个字符或仅一个字符串来提升拆分【英文标题】:boost split with a single character or just one string 【发布时间】:2011-04-18 07:06:33 【问题描述】:我希望将字符串拆分为单个字符或字符串。我想使用boost::split
,因为 boost 字符串是我们基本字符串处理的标准(我不想混合几种技术)。
在单个字符的情况下,我可以使用split(vec,str,is_any_of(':'))
,但我想知道是否有办法只指定单个字符。它可能会提高性能,但更重要的是,我认为仅使用一个字符代码会更清晰,因为 is_any_of 传达了与我想要的不同的含义。
为了匹配一个字符串,我不知道使用什么语法。我不想构建一个正则表达式;像split(vec,str,match_str("::")
这样的简单语法会很好。
【问题讨论】:
【参考方案1】:我一直在寻找相同的答案,但找不到。最后,我设法自己制作了一个。
您可以使用std::equal_to
来构成您需要的谓词。这是一个例子:
boost::split(container, str, std::bind1st(std::equal_to<char>(), ','));
当我需要使用单个字符拆分字符串时,我就是这样做的。
【讨论】:
【参考方案2】:在下面的代码中,为简洁起见,让我假设using namespace boost
。
至于按字符分割,如果只允许algorithm/string
,
is_from_range
可能达到目的:
split(vec,str, is_from_range(':',':'));
或者,如果允许lambda
:
split(vec,str, lambda::_1 == ':');
或者如果允许准备一个专用谓词:
struct match_char
char c;
match_char(char c) : c(c)
bool operator()(char x) const return x == c;
;
split(vec,str, match_char(':'));
至于匹配字符串,正如 David Rodri'guez 提到的,
split
似乎没有办法。
如果iter_split
是允许的,大概下面的代码就可以达到目的:
iter_split(vec,str, first_finder("::"));
【讨论】:
C++11 答案:[](char c) return c==':'
即原生 lambda。
MSalters 优秀评论中的小问题:缺少分号:[](char c) return c==':';
【参考方案3】:
简单来说,我会留下is_any_of
,因为很容易理解is_any_of( single_option )
的含义。如果你真的想改变它,第三个元素是函子,所以你可以将equals
函子传递给split
函数。
这种方法实际上不适用于多个标记,因为迭代意味着逐个字符。我对库的了解不足以提供预构建的替代方案,但您可以在 split_iterator
s
【讨论】:
以上是关于使用单个字符或仅一个字符串来提升拆分的主要内容,如果未能解决你的问题,请参考以下文章
使用 WHERE IN SQL 子句将字符串值从单个值拆分为多个值以获取数据