字符串

$$ \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
posted @ 2023-07-26 21:16  rksm2333  阅读(19)  评论(0)    收藏  举报  来源