字符串
$$ \texttt{SeekLuna Informatics} $$
字符串,输入输出处理
多组数据输出
给定组数
int T;
cin >> T;
for (int _ = 0; _ < T; _++){
int a,b;
cin >> a >> b;
cout << a + b << '\n';
}
int T;
cin >> T;
while (t--){
int a,b;
cin >> a >> b;
cout << a + b << '\n';
}
未给定组数
int a,b;
while (cin >> a >> b){
cout << a + b << '\n;'
}
友情提醒
数据千万条,清空第一条。
多测不清空,爆零两行泪。
清空不规范,超时总相伴。
cin 的注意事项
// 当 cin >> 读入的内容和控制台输入的内容类型不匹配时,直接结束输入。
int a,b;
cin >> a >> n; // 输入 "A 1";
// cin 默认以空白字符(空格符,换行符,制表符)
cin.get() 读入单个字符
用法1
// 把 cin.get()当作函数来使用
char c;
c = cin.get(); // 读入一整行
cin >> c; // 空格除外
用法2
// 直接读入
char c;
cin.get(c);
String 类的基本使用
声明,定义,下标访问,赋值
string s = "123abc"; // 定义
s = "56789"; // 赋值
cout << s[0]; // 下标访问
拼接
string s = "abc",t = "123";
cout << s + t << '\n'; // O(|t|)
s += t; // O(|t|)
string s = "abc",t = "xyz;
char c = 'A';
s = s + c; // O(1)
t = c + s; // O(s)
字典序比较
字典序:给定字符串 $s_1,s_2$,从左到右比较二者的每个字符,找到第一个 不相同的,这两个字符的大小关系就是 $s_1,s_2$ 的字典序关系。
"123" < "45"
"xyz" > "xy"
// 重载 < <= > >= != ==,比较字典序
string s = "7";
cout >> (s > "12") << '\n';
string s1,s2;
cout << (s1 == s2); // O(min{|s1|,|s2|})
输入
string s;
cin >> s; // 读入一个字符串,不包含空格,时间 O(|s|)
string t;
getling(t); // 读入一整行
长度
// .size().length() 返回长度,类型为无符号类型(unsigned),时间 O(1)
string s = "123";
for (int i = 0; i < s.size(); i++){
cout << s[i];
}
cout << s.empty(); // O(1)
string t = "abcde";
cout << t.size() - 5; // ULLONG_MAX - 4
截取子串
//.substr()返回字符串中的段子串,不修改原串,O(n),n 为字符串长度
string s = "abcdefghi";
cout << s.substr(3) << '\n';
cout << s.substr(3,2) << '\n';
cout << s.substr(3,100); // 返回 defghi
查询字串位置
// .find(字符串,[起始位置])返回给定字符串的位置,O(n,m),n,m 为长度
string s = "bcbcbcbcbcbc";
cout << s.find("bc") << '\n';
cout << s.find("bc",3) << '\n';
cout << int(s.find("123")) << '\n'; // -1
string t = "abcd";
cout << t.find("abcd") << '\n';
if (t.find("123") != string::npos){
}
string s,t;
s.find(s,t);
其他操作
//.insert(pos,t)在 pos 位置前插入一段字符串 t,O(n + m),n,m 为长度
string s;
cin >> s;
s.insert(4,"123");
cout << s << '\n';
string s,t'
s.insert(1,t); // O(|s| + |t|)
// .erase(pos,length),在 pos 位置起删除长度为 length 的字符串,如果 length 超过 n,那么将会删除整个后缀
string s = "123456789";
s.erase(3,2);
string s,t;
t.erase(1,3);
改变长度
//.resize(n)使得字符长度为 n,时间 O(n)
string s;
s.resize(10);
string t = "abcabcabc";
t.resize(10);
t.resize(2);
t.resize(5);
cin 与 getline 的混用
$\texttt{cin >> }$ 以空白字符作为分隔符,在输入完毕后空白字符在缓冲区中。
$\texttt{getline}$ 以换行符作为分隔,在输入完毕后换行符不在缓冲区中。
在调用 $\texttt{getline}$ 前,必须确保缓冲区中没有换行符。
示例
/*
假定输入为:
xy
abc def hij
*/
char a,b;
cin >> a >> b;
string s;
getline(cin,s); // 不会读到内容
// 如果 s 中需要读入 abc def hij
char a,b;
string s;
cin >> a >> b;
getline(cin,s); // getchar()
getline(cin,s);
迭代器
int a[5] = {3, 2, 4, 5, 1};
cout << a;
sort(&a[0], &a[5]); // a = [1,2,3,4,5]
string s;
sort(s.begin(), s.end()); // abcde
reverse(s.begin(), s.end()); // 翻转,edcba

浙公网安备 33010602011771号