Я думаю, я бы отделил данные от кода, что-то вроде:
std::map<char, std::string> reps;
reps['\0'] = "\\\0";
reps['\''] = "\\'";
reps['\"'] = "\\\"";
reps['\\'] = "\\\\";
for (int i=0; i<str.length(); i++)
if ((pos=reps.find(str[i])!=reps.end())
newStr.append(pos->second);
else
newStr.append(str[i]);
Вы, конечно, можете предпочесть использовать QMap
вместо std::map
. Это изменит то, как вы пишете несколько вещей, но не меняет основную идею.
В качестве альтернативы, поскольку каждый «специальный» вывод является просто исходным символом, которому предшествует обратный слеш, вы можете просто использовать std::set
символов, для которых требуется обратный слеш:
std::set<char> needs_slash;
needs_slash.insert('\'');
needs_slash.insert('\"');
needs_slash.insert('\0');
needs_slash.insert('\\');
for (int i=0; i<str.length(); i++) {
if (needs_slash.find(str[i]) != needs_slash.end())
newStr.append('\\');
newStr.append(str[i]);
}
Учитывая небольшое количество задействованных символов, вы также можете использовать что-то вроде std::bitset
или std::vector<bool>
. Мы говорим о 32 байтах памяти (если вы заботитесь только о 256 символах). Когда вы приступаете к этому, карта / набор просто используется в качестве разреженного массива, но если вы используете его только в одном (или даже нескольких) местах, вы, несомненно, сэкономите больше места (в коде) за счет используя массив, чем вы сохраняете (в данных), используя set / map.