Boost拆分使用单个字符或仅一个字符串
boost split with a single character or just one string
我希望将字符串拆分为单个字符或字符串。我想使用boost::split
,因为boost字符串是我们基本字符串处理的标准(我不希望混合几种技术)。
在单个字符的情况下,我可以做split(vec,str,is_any_of(':'))
,但我想知道是否有一种方法来指定单个字符。它可能会提高性能,但更重要的是,我认为只有一个字符的代码会更清晰,因为is_any_of传达了我想要的不同含义。
对于与字符串匹配,我不知道该使用什么语法。我不想构造一个正则表达式;一些简单的语法,如split(vec,str,match_str("::")
将是好的。
我在寻找同样的答案,但我找不到一个。最后,我自己制作了一个。
您可以使用std::equal_to
来形成您需要的谓词。下面是一个例子:
boost::split(container, str, std::bind1st(std::equal_to<char>(), ','));
当我需要使用单个字符分割字符串时,我就是这样做的。
在下面的代码中,为了简单起见,让我假设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("::"));
在简单的令牌上,我将只留下is_any_of
,因为它很容易理解is_any_of( single_option )
的含义。如果你真的想改变它,第三个元素是一个函子,所以你可以传递一个equals
函子给split
函数。
该方法实际上不适用于多个标记,因为迭代意味着逐个字符地进行迭代。我不太了解这个库,无法提供预构建的替代方案,但您可以在split_iterator
s