对于解析工作,我有一个字符串,它基本上可以是任何东西。
"something \t \n \0 \whatever else"
在解析结束时,我需要将输出序列化,使其易于使用JSON......这意味着我需要去掉控制字符。对于所有的值条目,我运行一个字符串清理程序:
void sanitizer(std::string & value){
for (auto& it : value){
if ((int) sit <= 31 || (int) sit == 127){
if (sit == '\t')
std::cout << "\\t";
else if (sit == '\r')
std::cout << "\\r";
else if (sit == '\0')
std::cout << "\\0";
else if (sit == '\n')
std::cout << "\\n";
else
std::cout << " ";
} else if (sit == '"'){
std::cout << '\'';
} else if (sit == '\\')
std::cout << "/";
else
std::cout << sit;
}
但是,仅这个函数就占据了解析器中大约44%的时间。
当我消除std::cout
调用,而是构建一个字符串,然后打印到cout
时,这会进一步降低速度。
有没有一种优化的方法可以用C++替换/转义字符串中的这些控制字符?
2条答案
按热度按时间yqkkidmi1#
一种方法是将
std::iscntrl
函数与std::remove_if
沿着使用:进一步的改进是实现您自己的字符分类函数。
std::iscntrl
使用当前的全局locale对象。rjee0c152#
下面的内容是否适合您的目的?