Самая быстрая выходящая из кавычки реализация?

System.Diagnostics.Debug.Assert (false);

инициирует всплывающее окно и позволит Вам присоединять отладчик к рабочему процессу.NET во время выполнения. Очень полезный в течение тех времен, когда по некоторым причинам Вы не можете непосредственно отладить приложение ASP.NET.

5
задан Mitch Wheat 22 July 2009 в 01:38
поделиться

4 ответа

Если скорость важна, для этого следует использовать рукописную функцию. Обратите внимание на использование 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;
}
6
ответ дан 14 December 2019 в 01:13
поделиться

Я бы вообще не брал исходную строку и не строил новую строку вывода.
Я бы перебирал исходную строку и печатал каждый символ, если это кавычка, то просто напечатайте a "\" перед печатью.

2
ответ дан 14 December 2019 в 01:13
поделиться

Я не удивлен, что регулярное выражение здесь действительно медленное - вы используете большой молоток общего назначения, чтобы забить крошечный гвоздь. Конечно, если вам понадобится сделать что-то более интересное, регулярное выражение может быстро получить преимущество с точки зрения простоты.

Что касается более простого / быстрого подхода, вы можете попробовать записать экранированную строку в отдельный буфер одним символом вовремя. Тогда добавление 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...
}
1
ответ дан 14 December 2019 в 01:13
поделиться

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\"

0
ответ дан 14 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: