
以下是题目原文,要求根据输入的操作来处理文档内容,并输出结果:

你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 0 个字符。需要支持以下操作:
1 str:后接插入,在文档后面插入字符串 str,并输出文档的字符串;2 a b:截取文档部分,只保留文档中从第 a 个字符起 b 个字符,并输出文档的字符串;3 a str:插入片段,在文档中第 a 个字符前面插入字符串 str,并输出文档的字符串;4 str:查找子串,查找字符串 str 在文档中最先的位置并输出;如果找不到输出 -1。为了简化问题,规定初始的文档和每次操作中的 str 都不含有空格或换行。最多会有 q 次操作。
第一行输入一个正整数 q,表示操作次数。
第二行输入一个字符串 str,表示最开始的字符串。
第三行开始,往下 q 行,每行表示一个操作,操作如题目描述所示。
一共输出 q 行。
对于每个操作 1,2,3,根据操作的要求输出一个字符串。
对于操作 4,根据操作的要求输出一个整数。
4
ILove
1 Luogu
2 5 5
3 3 guGugu
4 guILoveLuogu
Luogu
LuoguGugugu
3在我自己的实现中,我依赖了 C++ 中标准库提供的 string 类型,它使得字符串操作变得非常简单。主要操作如下:
我选择了使用 += 运算符来将字符串拼接到文档末尾,代码如下:
s += str;这样实现可以将新字符串 str 添加到当前文档 s 的末尾,符合题目的要求。
对于操作2,我使用了 substr(a, b) 函数来截取文档中的一部分。substr 函数接受两个参数,a 为起始位置,b 为截取长度。根据题目要求,我们需要将起始位置从 1-based 转换为 0-based,因此在调用 substr 时,将 a - 1 作为起始位置:
s = s.substr(a - 1, b);为了在指定位置插入字符串,我使用了 insert(a, str) 方法。这个方法会将字符串 str 插入到当前字符串 s 的第 a 个位置:
s.insert(a - 1, str);注意这里的 a - 1 是因为题目给定的是 1-based 索引,而 C++ 的字符串操作是基于 0-based 索引的。
对于操作4,我使用了 find(str) 函数来查找子串 str 在文档中最早出现的位置。如果没有找到该子串,find 函数会返回 string::npos,表示未找到:
size_t pos = s.find(str);
if (pos == string::npos)
cout << -1 << endl;
else
cout << pos << endl;#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
while(n--)
{
int m;
cin >> m;
switch(m)
{
case 1:
{
string s2;
cin >> s2;
s += s2;
cout << s << endl;
break;
}
case 2:
{
int a, b;
cin >> a >> b;
s = s.substr(a, b);
cout << s << endl;
break;
}
case 3:
{
int a;
string s2;
cin >> a >> s2;
s.insert(a, s2);
cout << s << endl;
break;
}
case 4:
{
string s2;
cin >> s2;
size_t idex = s.find(s2);
if(idex == string::npos)
cout << -1 << endl;
else
cout << idex << endl;
break;
}
}
}
return 0;
}老师的做法和我类似,核心思路没有变化,采用了 C++ 标准库的 string 类型及其内置的操作函数。具体代码如下:
a, b, 和 str,而我的做法是在每个操作中根据需要动态定义这些变量。while 循环外部,而我的做法将这些变量放在了每个 switch 语句内,确保了在每个操作中只定义所需变量。switch 语句:
switch 语句来处理不同的操作,明确区分了不同的操作类型。这种方式在处理多个互斥操作时非常清晰,且便于扩展。find 函数,并且处理了找不到子串时返回 -1 的逻辑,和我的做法相同。#include <iostream>
#include <string>
using namespace std;
int main()
{
int q = 0;
cin >> q;
string s;
cin >> s;
int a, b;
string str;
while (q--)
{
int m = 0;
cin >> m;
switch (m)
{
case 1:
cin >> str;
s += str;
cout << s << endl;
break;
case 2:
cin >> a >> b;
s = s.substr(a, b);
cout << s << endl;
break;
case 3:
cin >> a >> str;
s.insert(a, str);
cout << s << endl;
break;
case 4:
cin >> str;
size_t pos = s.find(str);
if (pos == string::npos)
cout << -1 << endl;
else
cout << pos << endl;
break;
}
}
return 0;
}string 类型的操作函数,如 +=, substr, insert, 和 find 来执行字符串操作。q 次操作并执行,每次执行后输出对应结果。switch 语句的各个分支中,老师则将更多的内容放在 switch 外部,尤其是变量的定义和初始化。+= 运算符可能会有性能问题,尤其是当字符串较长时。为了提高效率,可以使用 stringstream 或 vector<char> 来减少内存重分配带来的开销。a 和 b 超出了文档长度范围,应当做适当的处理。比如,在执行 substr(a, b) 时,可以检查 a + b 是否超过字符串的最大长度。本次文字处理软件题目考察了 C++ 中字符串的基本操作,特别是如何通过不同的方式处理字符串的拼接、截取、插入和查找。通过两种实现方法的对比,我们不仅看到了不同的实现方式,也发现了每种方法的优缺点。在实际编码中,我们可以根据具体情况选择合适的方式来实现。通过这些操作,我们能够更深入地理解 C++ 字符串的操作特性,并提升自己的编程能力。