System.Diagnostics.Debug.Assert (false);
инициирует всплывающее окно и позволит Вам присоединять отладчик к рабочему процессу.NET во время выполнения. Очень полезный в течение тех времен, когда по некоторым причинам Вы не можете непосредственно отладить приложение ASP.NET.
Если скорость важна, для этого следует использовать рукописную функцию. Обратите внимание на использование reserve ()
, чтобы попытаться свести (пере) выделение памяти к минимуму.
string escape_quotes(const string &before)
{
string after;
after.reserve(before.length() + 4);
for (string::size_type i = 0; i < before.length(); ++i) {
switch (before[i]) {
case '"':
case '\\':
after += '\\';
// Fall through.
default:
after += before[i];
}
}
return after;
}
Я бы вообще не брал исходную строку и не строил новую строку вывода.
Я бы перебирал исходную строку и печатал каждый символ, если это кавычка, то просто напечатайте a "\" перед печатью.
Я не удивлен, что регулярное выражение здесь действительно медленное - вы используете большой молоток общего назначения, чтобы забить крошечный гвоздь. Конечно, если вам понадобится сделать что-то более интересное, регулярное выражение может быстро получить преимущество с точки зрения простоты.
Что касается более простого / быстрого подхода, вы можете попробовать записать экранированную строку в отдельный буфер одним символом вовремя. Тогда добавление escape-символов становится тривиальным, и вы не тратите время на перераспределение строки или смещение символов. Самая большая трудность будет заключаться в управлении размером вашего буфера, но вы можете просто использовать для этого вектор и повторно использовать один и тот же вектор для каждой строки, чтобы избежать повторного выделения. Повышение эффективности будет во многом зависеть от деталей того, как работает вектор, но вы всегда можете свести это к необработанным массивам и ручному управлению памятью, если вам нужно.
Процедура могла бы выглядеть примерно так, если бы вы использовали вектор:
vector<char> buf;
for( some_iterator it = all_the_strings.begin();
it != all_the_strings.end(); ++it )
{
buf.clear();
const string & str = *it;
for( size_t i = 0; i < str.size(); ++i )
{
if( str[i] == '"' || str[i] == '\\' )
buf.push_back( '\\' );
buf.push_back( str[i] );
}
buf.push_back( '\0' );
// note: this is not guaranteed to be safe, see answer comments
const char * escaped = &buf[0];
// print escaped string to file here...
}
Well here is an implementation using string::find and string::insert, not sure if its faster, you'll have to figure that out! Here it is:
std::string src = "hey there i have \" all \" over the f\"in pla\"ce\"";
size_t n = 0;
while ( (n=src.find("\"",n)) != std::string::npos )
{
src.insert(n,"\\");
n+=2;
}
std::cout << src << std::endl;
Which printed:
hey there i have \" all \" over the f\"in pla\"ce\"