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

Use*_*645 0 c++ csv string performance stringstream

我正在处理 CSV 并使用以下代码来处理一行。

玩代码

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;
}
Run Code Online (Sandbox Code Playgroud)

它的作用:函数s根据delimiter. 如果分隔符被转义,escape分隔符将被忽略。

此代码有效,但速度非常慢。我怎样才能加快速度?

您是否知道任何现有的 csv 处理实现可以做到这一点以及我可以使用哪些?

Vla*_*ein 5

做某事最快的方法就是根本不做。

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

[编辑] 我还没有升级到 C++17,所以string_view对我来说没有:)

注意:典型的 CSV 与您暗示的不同;它不为逗号使用转义符,而是用双引号将带有逗号的条目括起来。但我假设你知道你的数据。

执行:

#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 << " ";
}
Run Code Online (Sandbox Code Playgroud)