这篇博客主要介绍如何在读入字符串时速度更快
以及strlen和.length()的区别
以及一些小知识(没错就是很杂)
壹.如何在读入字符串速度更快
在读入一个字符串时,一般是只能用cin读入
std::string a;
int main()
{
cin >> a;
}
想让它读的更快,就需要有一些优化
std::string a;
int main()
{
ios::sync_with_stdio(false);
cin >> a;
}
在C++中,为了保证与C的兼容性,通常要把cout和printf一起绑定再输出流。这样在cin和cout中,输出时要先进入缓冲区再输出,这样效率就会大大降低,从而造成了cin比不上scanf的假象。
解决方法:只需要把“是否兼容stdio”开关关闭即可。
小提示:当你写了freopen后就不能再解绑了,因为解绑与重定向不能同时使用
再优化:在默认的情况下cin是和cout绑定在一起的,每次执行操作符<<的时候都要调用flush这样会增加IO(输入输出)负担。
解决方法:可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,从而进一步加快效率。
std::string a;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> a; //此时严禁用scanf和printf
cout << a;
}
以上就是如何在读取字符串时更快一些
贰.strlen和.length()的区别
strlen接受一个字符指针,它返回这个字符指针指向的字符串的长度
.length()是string类的成员函数,它返回这个string的长度
//输入字符串
//string型
std::string a;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> a;
for (int i = 0; i < a.length(); i++) cout << a[i] << " ";
}
//char型
const int maxn = 1e5 + 7;
char a[maxn];
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> a;
for (int i = 0; i < strlen(a); i++) cout << a[i] << " ";
}
strlen是O(n)的,而string::.length()是O(1)的
char只能用strlen,而string转换成char后也可以用strlen
叁.一些小知识
c_str()的用法:
string::c_str()返回的是指向这个string实际数据储存位置的指针,这个位置的合法长度不可能超过这个string有史以来的最长长度。
也就是说,如果你的string曾经有过1000个字符,那么你最多就只能通过这种方式往里面输入1000个字符。
//LARGE是你要输入的字符串的最长的可能长度
const int LARGE = 1e6;
char buff[LARGE + 2];
std::string a;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> buff;
a = buff;
cout << a.c_str() << endl;;
return 0;
}
给出多组数据,要求输入
例:
7 7
5 8
5 2
2 1
有两种输入方法
//第一种
while (scanf("%d %d", &a, &b) != EOF)
//第二种
while (~scanf("%d %d", &a, &b))