[OI

这篇博客主要介绍如何在读入字符串时速度更快

以及strlen.length()的区别

以及一些小知识qwq(没错就是很杂)

壹.如何在读入字符串速度更快

在读入一个字符串时,一般是只能用cin读入

1 std::string a;
2 int main()
3 {
4     cin >> a;
5 }

想让它读的更快,就需要有一些优化(

1 std::string a;
2 int main()
3 {
4     ios::sync_with_stdio(false); 
5     cin >> a;
6 }

在C++中,为了保证与C的兼容性,通常要把cout和printf一起绑定再输出流

这样在cincout中,输出时要先进入缓冲区再输出,这样效率就会大大降低

//从而造成了cin比不上scanf的假象

只需要把“是否兼容stdio”开关关闭即可

小提示:当你写了freopen后就不能再解绑了,因为解绑与重定向不能同时使用

(血泪教训qwq

再优化:在默认的情况下cin是和cout绑定在一起的,每次执行操作符<<的时候都要调用flush这样会增加IO(输入输出)负担。

可以通过tie(0)(0表示NULL)来解除cincout的绑定,从而进一步加快效率

1 std::string a;
2 int main()
3 {
4     ios::sync_with_stdio(false); 
5     cin.tie(0);
6     cin >> a;
7 }

以上就是如何在读取字符串时更快一些

贰.strlen.length()的区别

strlen接受一个字符指针,它返回这个字符指针指向的字符串的长度

.length()是string类的成员函数,它返回这个string的长度

 1 //输入字符串
 2 
 3 //string型
 4 std::string a;
 5 
 6 int main()
 7 {
 8     std::ios::sync_with_stdio(false);
 9     std::cin.tie(0);
10     cin >> a;
11     for (int i = 0; i < a.length(); i++) cout << a[i] << " ";
12 } 
13 
14 //char型
15 const int maxn = 1e5 + 7;
16 
17 char a[maxn];
18 
19 int main()
20 {
21     std::ios::sync_with_stdio(false);
22     std::cin.tie(0);
23     cin >> a;
24     for (int i = 0; i < strlen(a); i++) cout << a[i] << " ";
25 } 

 strlen是O(n)的,而string::.length()是O(1)的

char*只能用strlen,而string转换成char*后也可以用strlen

 .一些小知识

c_str()的用法:

string::c_str()返回的是指向这个string实际数据储存位置的指针,这个位置的合法长度不可能超过这个string有史以来的最长长度

也就是说,如果你的string曾经有过1000个字符,那么你最多就只能通过这种方式往里面输入1000个字符

 1 //LARGE是你要输入的字符串的最长的可能长度
 2 const int LARGE = 1e6;
 3 char buff[LARGE + 2];
 4 std::string a; 
 5 int main()
 6 {
 7     std::ios::sync_with_stdio(false);
 8     std::cin.tie(0);
 9     cin >> buff;
10     a = buff;
11     cout << a.c_str() << endl;;
12     return 0;
13 }

//以下的这个小知识点我感觉...emmm可能全天下只有我不会qwq

给出多组数据,要求输入

例:

7 7
5 8
5 2
2 1

有两种输入方法

1 //第一种
2 while (scanf("%d %d", &a, &b) != EOF)
3 
4 //第二种
5 while (~scanf("%d %d", &a, &b)) 

最后感谢MnFe对以上内容的指导

原文地址:https://www.cnblogs.com/aiyi2000/p/9770451.html