How to adapt a string splitting algorithm using pointers so it uses iterators instead?
下面的代码来自这个关于字符串拆分的问题的答案。它使用指针,对这个答案的评论表明它可以适用于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <vector> #include <string> using namespace std; vector<string> split(const char *str, char c = ',') { vector<string> result; do { const char *begin = str; while(*str != c && *str) str++; result.push_back(string(begin, str)); } while (0 != *str++); return result; } |
好吧,我显然用字符串替换了char,但后来我注意到他使用的是指向字符开头的指针。这对弦来说是可能的吗?循环终止条件如何更改?做这个改变时还有什么需要担心的吗?
可以使用迭代器而不是指针。迭代器提供了一种遍历容器的方法,通常可以认为它类似于指针。
在这种情况下,可以使用
对于内部循环,终止条件是相同的;当您点击要拆分字符串的分隔符时,您希望停止。对于外部循环,您可以将迭代器与已经从
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | std::vector<std::string> split(const std::string& str, const char delim = ',') { std::vector<std::string> result; auto end = str.cend(); auto iter = str.cbegin(); do { auto begin = iter; while (iter != end && *iter != delim) ++iter; result.push_back(std::string(begin, iter)); if (iter == end) break; // See note (**) below. } while (iter++ != end); return result; } |
请注意iner循环条件中的细微差别:它现在测试我们是否在试图取消引用之前达到了目的。这是因为我们不能取消对指向容器末尾的迭代器的引用,所以在尝试取消引用之前必须检查这一点。原始算法假定字符串以空字符结尾,所以我们可以取消对指向该位置的指针的引用。
(**)当EDCOX1〔8〕已为