初看还觉得操作有点多,一下子懵懵的。但是先不要急,我们来分析一下每一个操作。
Part 1 $COPY$
复制
方法一:暴力$for$循环
其实就是从字符串$s$中提取出一段区间$[l,r]$,存入字符串$t$里面。
那么,一个很简单而又很暴力的操作就是跑一遍$for$循环:
void COPY(int l, int r) {
t = "";
for (int i = l;i <= r; i++) t += s[i];
}
方法二:$STL$ $string$函数
在这里感谢C艹给了我们一个函数:substr
,直接调用substr(起点, 长度)
就可以返回字符串中的这个区间。
那么,代码就可以进一步优化了:
void COPY(int l, int r) { t = s.substr (l, r - l + 1); }
Part 2 $CUT$
剪切
剪切呢……其实从本质上看就是先$COPY$然后再执行区间删除。
那么$COPY$就和上面一样了,下面只讲删除。
方法一:暴力for循环
用$for$截取区间前面的字符串和后面的字符串,拼接在一起就变成了删除后的字符串(也就是跳过中间的区间)。
string S = "";
for (int i = 0;i < l; i++) S += s[i];
for (int i = r + 1; i < s.size(); i++) S += s[i];
s = S;
方法二:利用$COPY$的操作
如果你看懂了上面$COPY$的第二种方法,相信这个你也一定看得懂。
利用substr
来截取,其实和方法一也差不多。
s = s.substr(0, l) + s.substr(r + 1, s.size() - r - 1);
方法三:也是$STL$ $string$函数
继续感谢$STL$ $string$函数……
erase(起点,区间长度)
这个确实很好用,一行代码就解决了。
s.erase(l, r - l + 1);
Part 3 $PASTE$
粘贴
方法一:暴力$for$循环
先把字符串$s$拆成前后两个部分,然后在中间插入t就完事了。
string S = "";
for (int i = 0;i <= x; i++) S += s[i];
S += t;
for (int i = x + 1;i < s.size(); i++) S += s[i];
s = S;
方法二:还是利用$COPY$的操作
还是一样……把字符串$s$拆成前后两个部分(只不过用的是substr
函数)。
s = s.substr (0, x + 1) + t + s.substr (x + 1, s.size() - x - 1);
方法三:又双㕛叒叕是$STL$ $string$函数
继续感谢C艹……
insert(插入点, 要插入的字符串)
这个也十分简洁……
那么最后就变成了:
s.insert(x + 1, t);
好啦,这次就到这里啦,有什么问题或建议请在评论区留言,谢谢!
现在献上完整代码:
#include <bits/stdc++.h>
using namespace std;
string s, t;
int m;
void COPY(int l, int r) { t = s.substr (l, r - l + 1); }
void CUT(int l, int r) {
COPY(l, r);
s.erase(l, r - l + 1);
}
void PASTE(int x) { s.insert(x + 1, t); }
int main() {
cin >> s >> m;
while (m--) {
string opt; cin >> opt;
if (opt == "COPY") {
int l, r; cin >> l >> r;
COPY(l, r);
}
if (opt == "CUT") {
int l, r; cin >> l >> r;
CUT(l, r);
}
if (opt == "PASTE") {
int x; cin >> x;
PASTE(x);
}
cout << s << endl;
}
return 0;
}
啊,这STL,太太太太好用了吧