这篇博客主要介绍如何在读入字符串时速度更快
以及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一起绑定再输出流
这样在cin和cout中,输出时要先进入缓冲区再输出,这样效率就会大大降低
//从而造成了cin比不上scanf的假象
只需要把“是否兼容stdio”开关关闭即可
小提示:当你写了freopen后就不能再解绑了,因为解绑与重定向不能同时使用
(血泪教训qwq
再优化:在默认的情况下cin是和cout绑定在一起的,每次执行操作符<<的时候都要调用flush这样会增加IO(输入输出)负担。
可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,从而进一步加快效率
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对以上内容的指导