C++ std::vector中的push_back()<;标准::字符串>;覆盖当前字符串

C++ std::vector中的push_back()<;标准::字符串>;覆盖当前字符串,c++,string,vector,C++,String,Vector,我试图在为一个非常简单的文本编辑器插入新行作为类的项目时实现一个撤销函数。在程序中,列是光标当前所在的位置,行是向量所在的当前行 我成功地创建了“insertNewLine()”函数,它使用了一个std::vector,可以在屏幕上显示文本。我就是这样实现的: void Editor::insertNewLine() { // get a substring prevLine = lines[row - 1]; size_t tempSize = prevLine.siz

我试图在为一个非常简单的文本编辑器插入新行作为类的项目时实现一个撤销函数。在程序中,列是光标当前所在的位置,行是向量所在的当前行

我成功地创建了“insertNewLine()”函数,它使用了一个
std::vector
,可以在屏幕上显示文本。我就是这样实现的:

void Editor::insertNewLine()
{
    // get a substring
    prevLine = lines[row - 1];
    size_t tempSize = prevLine.size();
    int lengthOffset = getSubstringOffset(tempSize, (column - 1));
    std::string cutTemp = prevLine.substr((column - 1), lengthOffset);
    lines[row - 1].erase(column - 1);
    // after incrementing, row and amount of lines, initialize the new row
    row++;
    numberOfLines++;
    column = 1;
    lines.push_back(cutTemp); // insert substring into new line
}
以下是当前输出的示例(其中|是光标):

现在,我可以撤消任何其他命令,但在尝试撤消新行时,我需要将光标返回到上一列,并将单词推回原来的位置。我尝试通过这样做来实现这一点:

void Editor::undoNewLine()
{
    std::string source = lines[row - 1]; // save current line
    lines[row-1].clear(); // clear current line
    row--; // revert up one row
    numberOfLines--; // revert amount of lines
    lines.push_back(source); // append
}
使用此函数,我期望输出如下所示(来自上面的示例):

但是,问题是,这是我从当前代码中得到的输出:

(user presses a button that calls undoNewLine())
|world
本质上,使用push_back(source)会覆盖原来的内容,并将光标移到前面。我试图将列增加到撤消阶段之前的原始位置,但是,这也不起作用。我刚刚得到了以下输出:

(user presses a button that calls undoNewLine())
world|

那么,我应该如何尝试并实现这个撤销功能呢?有关于我做错了什么的提示或想法吗?

在您的解决方案中,您正在通过调用clear()删除前一行的内容(hello)。相反,只需附加当前行。string类使这一点变得简单:

lines[row-1] += lines[row];
之后,可以使用删除当前行

注意 请注意,这可能是低效的,因为下面的所有行都需要重新定位。
如果这确实成为一个问题,您可以切换到std::list,但随后您将失去对行的随机访问

类似于
lines.back()+=source也许?您需要连接这两行。你没有这样做。@Barmar我是否要将两者都拉出,连接起来,然后写在新行上?@user657267不幸的是,示例中的原始文本(hello)保留了下来,我需要向上推的文本最终被删除:[没有问题!没有更多信息,我不确定。可能撤消时光标设置不正确?或者行数不正确?
(user presses a button that calls undoNewLine())
world|
lines[row-1] += lines[row];