代码之家  ›  专栏  ›  技术社区  ›  User12547645

如何快速将字符串分解成向量?

  •  0
  • User12547645  · 技术社区  · 5 年前

    play with code

    std::vector<std::string> string_to_vector(const std::string& s, const char delimiter, const char escape) {
      std::stringstream sstr{s};
      std::vector<std::string> result;
      while (sstr.good()) {
        std::string substr;
        getline(sstr, substr, delimiter);
        while (substr.back() == escape) {
          std::string tmp;
          getline(sstr, tmp, delimiter);
          substr += "," + tmp;
        }
        result.emplace_back(substr);
      }
      return result;
    }
    

    函数分解字符串 s delimiter . 如果分隔符转义为 escape 将忽略分隔符。

    这段代码可以工作,但速度非常慢。

    0 回复  |  直到 5 年前
        1
  •  5
  •   Vlad Feinstein    5 年前

    做某事最快的方法就是完全不做。

    如果你能确保你的源字符串 s 将比返回向量的使用寿命长,您可以替换 std::vector<std::string> std::vector<char*> 指向每个子串的开头。然后用零替换已标识的分隔符。

    [编辑]我没有移动到C++ 17,所以没有 string_view

    实施:

    #include <iostream>
    #include <vector>
    #include <string>
    
    std::vector<char*> string_to_vector(std::string& s, 
                                        const char delimiter, const char escape) 
    {
      size_t prev(0), pos(0), from(0);
      std::vector<char*> v;
      while ((pos = s.find(delimiter, from)) != s.npos)
      {
        if (pos == 0 || s[pos - 1] != escape)
        {
          s[pos] = 0;
          v.push_back(&s[prev]);
          prev = pos + 1;
        }
        from = pos + 1;
      }
      v.push_back(&s[prev]);
      return v;
    }
    
    int main() {
      std::string test("this,is,a\\,test");
      std::vector<char*> v = string_to_vector(test, ',', '\\');
    
      for (auto& s : v)
        std::cout << s << " ";
    }