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