1.C++版本区别与选择
C++98 (ISO/IEC 14882:1998) | C++的第一个版本于1998年10月发布。有一些较老的oj在使用。 |
C++03(ISOIEC 14882:2003) | 在这个版本的C++中,值初始化是在2003年2月引入的. |
C++11(蓝桥杯选用) | 它于2011年8月发布。这个C++修订版引入Lambda表达式、委托构造函数、统一初始化语法、自动类型推导auto、nullptr.、decltype、Rvalue、References等。 |
C++14 | 它于2014年8月发布。此版本中添加的功能包括多态 lambda、数字分隔符、通用lambda捕获、变量模板、二进制整数文字、引用字符串等。 |
C++17 | 它于2017年12月发布。它引入了折叠表达式、十六进制浮点文字、u8字符文字、带有初始化程序的选择语句、内联变量等。 |
C++20 | 它于2020年12月发布。包括的一些新功能包括:测试宏3路比较、运算符<=>和运算符==()=默认值、新属性:[no_unique_address]]、[[likely]、[[不太可能]] |
2.C++输入和输出
#include <stdio.h>
double x;
char str[20];
输入 scanf(“%lf”,&x);
scanf(“%s”,str);
输出 printf(“%.3lf\n”,x);
printf(“Hello World\n”)
#include <iostream>
#include <string>
using namespace std;
double x;
string str;
输入cin>>x;
cin>>str;
输出 cout<<fixed << setprecision(3)<<endl;
cout<<“Hello World”<<endl;
说明:
1.如果str中要存储”Hello World”,如何做到?
说明,%s输入遇到空格或回车就会停下。
C:
gets(str); //stdio.h中gets函数
scanf("%[^\n]",str); //[]中是一个正则表达式,表示读入排除回车之外的所有数据。
C++:
getline(cin,str); //c++中没有正则表达式
2.万能头文件
#include<bits/stdc++>
说明,这要服务器端编译环境支持,一般支持。
3.取消同步流
由于cin和cout需要自动判断变量类型等内部原因,读写效率比scanf和printf更低。当数据量较大时,可能导致程序运行超时。
我们可以通过取消同步流来加速cin和cout,加速后效率相差无几。
调用cin、cout前输入以下命令:
ios::sync_with_stdio(e), cin.tie(e),cout.tie(e);
3.string类
string是C++标准库的重要组成部分,主要用于字符串处理。
使用string库需要在头文件中包括该库 #include<string>
string与char[]不同,string实现了高度的封装,可以很方便地完成各种字符串的操作,比如拼接、效取、匹配等。
1)字符串管理:string封装了字符串的存储和管理。它自动处理字符串的内存分配和释放,避免了手动管理内存的麻烦。
2)动态大小调整:string可以根据需要自动调整字符串的大小。在添加或删除字符时string会自动调整内部的存储容量,确保足够的空间来容纳字符串。
3)安全性:string提供了一些方法来确保字符串的安全性。例如,它提供了越界访问检查,以避免访问超出字符串范围的字符。
- 迭代器支持:string支持迭代器,可以使用迭代器遍历字符串中的字符,进行字符级别的操作。
- 兼容性:string是C++标准库的一部分,因此在C++中广泛使用,并且与其他标准库组件和C++语言特性兼容。
基本操作
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1; //空值
string str2="Hello,world!"; //初始化
string str3=str2; //用其他字符串变量赋值
string str4=str2.substr(0,5); //取子串,下标0开始,长度5
const char* charArray="Hello";
string str5(charArray); //用字符数组赋初值
string str6(5,'A'); //用5个重复'A'赋值
printf( "str = %s\n",str6.c_str());//c_str()转成字符数组
return 0;
}
1.获取字符串长度(length/size)
int length=str6.length();
2.字符串查找(find)
size_t pos=str2.find("wor1d" );
3.拼接字符串(+或append)
string result1=str5 + "," +str6;//使用+运算符
string result2=str5.append(",").append(str6);//使用append()函数
4.字符串替换(replace)
result2.replace(6,6,"world!");
5.提取子字符串(substr)
string subStr=str2.substr(0,5); //0起始位置,5长度
6.字符串比较(compare)
int res=result1.compare(result2);
string重载了不等号,所以可以直接使用s1<s2的方式来比较string的大小,比较的规则是按照字典序大小进行比较。
res=result1<result2;
cout<<res<<endl;
7.遍历string
A.循环枚举下标
string s="Hello";
for(int i=0;i<s.length();++i)
cout<<i;
cout<<'\n';
B.auto枚举(其中&表示取引用类型,如果对i修改将会改变原来的值)
DEV工具菜单,修改编译选项,在"链接器命令行”加入"-std=c++11",重新进行编译,即可解决问题
for(auto i:s)
{
cout<<i;
i='a';//此处的修改无效,这个i是拷贝出来的,不是引用s的
}
cout<<'\n';
for(auto &i:s)
{
cout<<i;
i='a';//此处修改会改变s的字符值
}
cout<<'\n';
cout<<s;