C++中有关字符串的的处理

这篇博客主要介绍如何在读入字符串时速度更快
以及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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值