【发布时间】:2022-01-04 13:07:38
【问题描述】:
我不复制字符串以稍后修剪它。 我解析 csv 文件,我的代码:
while(std::getline(stream, line))
{
boost::tokenizer<boost::escaped_list_separator<char>> tok(line);
std::for_each(tok.begin(), tok.end(), handler);
}
parseCSV(file, [](const std::string& tok)
{
std::vector<SpiceSimulation::DataVector*> arrays;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << "\t-->" << tok << std::endl;
//std::string cptoken = boost::trim_copy(tok);
//Read Header Titles
if(boost::starts_with(tok, "v"))
{
std::cout << "START WITH\n";
}
});
我的文件.csv:
time, vtime2, vtime3, vtime4 ...
我得到带有空格的结果 结果:["time","vtime2","vtime3","vtime4"]
如何在不复制的情况下消除这些空格?如果我将正确的标记器返回结果理解为 basic_string 它不是原始字符串的副本
【问题讨论】:
-
你为什么不想复制字符串(过早的优化警报)。另外,请不要复制:boost.org/doc/libs/1_78_0/doc/html/boost/algorithm/trim.html
-
我不能用token作为参数调用这个函数,因为token是basic_string
-
这很好。 Trim 采用对序列的任何可变引用:coliru.stacked-crooked.com/a/c63ba5193ad0c43e - 当然,当
for_each没有将令牌作为可变引用传递时,真正的问题可能是(?)。更多不为您的任务使用该界面的理由。但是,您从来没有回答过为什么不想复制字符串。 -
只因为性能
-
是的。证明它[分析先于优化]。它不会飞。那么,您的瓶颈首先是 100% 标记为字符串。你看到我的任何例子了吗?参见例如coliru.stacked-crooked.com/a/dc5f0f1cfd91c456(来自stackoverflow.com/a/48997464/85371)或例如这些良好实践的宝库:stackoverflow.com/a/48533015/85371