如何快速将字符串分解为向量?
How to break up a string into a vector fast?
我正在处理 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;
}
它的作用: 函数根据 delimiter
拆分字符串 s
。如果使用 escape
对定界符进行转义,定界符将被忽略。
此代码有效,但速度极慢。 我怎样才能加快速度?
您是否知道任何现有的 csv 处理实现完全可以做到这一点并且我可以使用它?
做某事最快的方法就是根本不做。
如果您可以确保您的源字符串 s
将比返回向量的使用时间更长,您可以将 std::vector<std::string>
替换为 std::vector<char*>
,这将指向每个字符串的开头子串。然后,您将已识别的分隔符替换为零。
[编辑] 我还没有升级到 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 << " ";
}
我正在处理 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;
}
它的作用: 函数根据 delimiter
拆分字符串 s
。如果使用 escape
对定界符进行转义,定界符将被忽略。
此代码有效,但速度极慢。 我怎样才能加快速度?
您是否知道任何现有的 csv 处理实现完全可以做到这一点并且我可以使用它?
做某事最快的方法就是根本不做。
如果您可以确保您的源字符串 s
将比返回向量的使用时间更长,您可以将 std::vector<std::string>
替换为 std::vector<char*>
,这将指向每个字符串的开头子串。然后,您将已识别的分隔符替换为零。
[编辑] 我还没有升级到 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 << " ";
}