使用单个字符或仅一个字符串来提升拆分

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/stringis_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_iterators

之上实现该功能

【讨论】:

以上是关于使用单个字符或仅一个字符串来提升拆分的主要内容,如果未能解决你的问题,请参考以下文章

拆分C++字符串提升?

是否可以在单个语句中拆分和分配字符串?

使用 WHERE IN SQL 子句将字符串值从单个值拆分为多个值以获取数据

如何在字符串中拆分和添加单个值?

如何通过拆分其中的字符串将单个列拆分为多个。 -Pandas Python [重复]

将字符串拆分为多个原始类型