Как увидеть последний символ в объекте stringstream с O (1) постоянной сложностью? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь заполучить завершающие символы новой строки на std::stringstream объекте после сброса в него каких-то вещей. Сейчас я бы попробовал что-то вроде этого:

const char* inputvalue = "My line\n";
std::stringstream stream;

stream << std::string{inputvalue};
stream.seekp( -1, std::ios_base::end );

if( stream.peek() == '\n' ) {
    stream << " ";
} else {
    stream.seekp( 0, std::ios_base::end );
}

Это самый эффективный способ сделать это, т. Е. Меньшее количество инструкций процессора и времени?

В качестве примечания, могу ли я полностью удалить последний символ новой строки, кроме ввода пробела, чтобы избавиться от новой строки без ущерба для производительности?

1 Ответ

0 голосов
/ 07 июня 2019

Перед добавлением вещи на stringstream я беру const char* и проверяю, есть ли на ней новая строка \n. Если это так, я приведу его к char* и завершу строку \0 на size-1.

Py_ssize_t linesize;
std::stringstream stream;

char* nonconstcharline;
const char* constcharline;

for( PyObject* linepy : linecache ) {
    constcharline = PyUnicode_AsUTF8AndSize( linepy, &linesize );

    if( constcharline[linesize-1] == '\n' ) {
        nonconstcharline = const_cast<char *>( constcharline );
        nonconstcharline[linesize-1] = '\0';
        stream << std::string{nonconstcharline};
    }
    else {
        stream << std::string{constcharline};
    }
}

Я читаю на этот другой вопрос Как использовать const_cast? Я не должен делать const char* на char* и менять его, так как мне кажется, что я не владею const char* вещью, но пока нет проблем.

...