我想写一个简单的字符串split函数.
该函数应该采用一个std::basic_string和一个分隔符(可能是一个CharT或std::basic_string),并将结果放入一个ContainerT.
我的第一次尝试是
template <typename StringT, typename DelimiterT, typename ContainerT>
void split(
const StringT &str, const DelimiterT &delimiters, ContainerT &conts) {
conts.clear();
std::size_t start = 0, end;
std::size_t len = delimiters.size();
while ((end = str.find(delimiters, start)) != StringT::npos) {
if (end - start) {
conts.emplace_back(str, start, end - start);
}
start = end + len;
}
if (start != StringT::npos && start < str.size()) {
conts.emplace_back(str, start, str.size() - start);
}
}
Run Code Online (Sandbox Code Playgroud)
我的最终目标是扩展此功能以实现:
std::basic_string<CharT>放在一些conts.str可以是std::basic_string<CharT>,const CharT*或字符串文字.delimiter可以是一个char,或一个std::basic_string<CharT>/ const CharT*/字符串文字,意味着定界符的长度大于1时,例如,拆分aaa,,bbb,c与,,给出aaa/bbb,c.STL.由于人们通常使用C++处理现代咒语,因此2可能std::basic_string<CharT>只是为了简化.
鉴于函数(模板)可以重载,我想知道
const CharT*分隔符,该行std::size_t len = delimiters.size();必须更改为某些std::distance(...)?更新:
根据输入字符串进行构造basic_string_view,然后对其进行操作。Abasic_string_view有一个显式构造函数,采用 a char*,并且basic_string有一个强制转换运算符 to basic_string_view。