diff --git a/src/util.cc b/src/util.cc index a9b1707297..b820aabb3a 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1501,26 +1501,27 @@ TEST_CASE("util tokenize_string") CHECK(v2.size() == 1); } -vector* tokenize_string(string input, const string& delim, +vector* tokenize_string(const string &input, const string& delim, vector* rval, int limit) { if ( ! rval ) rval = new vector(); + size_t pos = 0; size_t n; auto found = 0; - while ( (n = input.find(delim)) != string::npos ) + while ( (n = input.find(delim, pos)) != string::npos ) { ++found; - rval->push_back(input.substr(0, n)); - input.erase(0, n + 1); + rval->emplace_back(input.substr(pos, n - pos)); + pos = n + 1; if ( limit && found == limit ) break; } - rval->push_back(input); + rval->emplace_back(input.substr(pos)); return rval; } diff --git a/src/util.h b/src/util.h index 3065652bea..40c45b274e 100644 --- a/src/util.h +++ b/src/util.h @@ -145,7 +145,7 @@ inline std::string get_escaped_string(const std::string& str, bool escape_all) return get_escaped_string(str.data(), str.length(), escape_all); } -std::vector* tokenize_string(std::string input, +std::vector* tokenize_string(const std::string &input, const std::string& delim, std::vector* rval = 0, int limit = 0);