如何以O(1)恒定复杂度查看stringstream对象中的最后一个字符?

时间:2019-06-06 22:26:13

标签: c++ stringstream

在将某些内容刷新到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 );
}

这是最有效的方法,即减少CPU指令和时间吗?

作为旁注,除了放一个空格字符以摆脱新行而又不牺牲性能的情况下,我是否可以完全删除最后一个换行符?

1 个答案:

答案 0 :(得分:0)

在将事物添加到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};
    }
}

我读了另一个问题How to use const_cast?,我不应该对const char*char*并更改它,因为我似乎不拥有const char*,但到目前为止没问题。