对于解析作业,我有一个基本上可以是任何东西的字符串。 “ 例如:
"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 ++替换/转义字符串中的这些控制字符?
答案 0 :(得分:4)
一种方法是使用std::iscntrl
功能和std::remove_if
:
void remove_control_characters(std::string& s) {
s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return std::iscntrl(c); }), s.end());
}
进一步改进将是实现自己的角色分类功能。 std::iscntrl
使用当前的全局语言环境对象。