STL——string
标准库类型string表示可变长的字符序列,注意加头文件
蓝桥杯C++组基础知识之标准库类型string_αγ的博客-CSDN博客标准库类型string标准库类型string表示可变长的字符序列,使用前先加头文件#include<string>using std::string1、定义和初始化string对象string s1;//默认初始化,s1是一个空字符串string s2=s1;//s2是s1的副本//拷贝初始化string s2(s1);//s2是s1的副本//直接初始化string s3="hiya";//s3是该字符串字面值的副本//拷贝初始化string s3("hiyahttps://blog.csdn.net/qq_44778120/article/details/122227154?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164897065116780366588492%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164897065116780366588492&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-122227154.142%5Ev5%5Epc_search_result_control_group,157%5Ev4%5Econtrol&utm_term=%E8%93%9D%E6%A1%A5%E6%9D%AF%E4%B8%ADstring%E7%9A%84%E4%BD%BF%E7%94%A8&spm=1018.2226.3001.4187
1、定义和初始化string对象
▲string s1; //默认初始化,s1是一个空字符串
▲string s2=s1; //s2是s1的副本//拷贝初始化
string s2(s1); //s2是s1的副本//直接初始化
▲string s3="hiya"; //s3是该字符串字面值的副本//拷贝初始化
string s3("hiya"); //s3是该字符串字面值的副本//直接初始化
▲string s4=(10,'c'); //s4的内容是cccccccccc//拷贝初始化
string s4(10,'c'); //s4的内容是cccccccccc//直接初始化
2、string对象上的操作
s.substr(a,b) 截取字符
操作 | 说明 |
---|---|
os<<s /cout<<s | 将s写到输出流os中,返回s |
is>>s / cin>>s | 从输入流 is中读取字符串赋给s,字符串以空白分隔,返回is |
getline(is,s) / getline(cin,s) | 从is中读取一行赋给s,返回is |
s.empty() | s为空返回true,s不空返回false |
s.size() | 返回s中字符个数 |
s[n] | 返回s中第n个字符的引用,位置从0计起(同数组) |
s3=s1+s2 | 返回s1和s2连接后的字符串(字符串连接) |
s2=s1 | 字符串拷贝 |
s1==s2 | 判断两个字符串所含字符是否完全一样 |
s1!=s2 | string对象相等性对字母的大小写敏感 |
<,<=,>=,> | 利用字符在字典中的顺序进行比较,且对字母的大小写敏感 |
- 在将标准输入的内容读取到s中时(cin>>s;),string对象会自动忽略开头的空白(空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白为止。即会吞掉第一个空格
// string s1; cin>>s1; //输入" hello world " cout<<s1<<endl; //输出"hello" // string s1,s2; cin>>s1>>s2; //输入" hello world " cout<<s1<<s2<<endl; //输出"helloworld"
- getline读取一行,以换行符结束,但换行符是被读取进来了,在把所读内容存到string对象中时不存换行符。
- size函数返回string对象的长度,返回类型实际上时string::size_type类型(无符号类型的值)能够存放下任何string对象的大小。无符号数在与有符号数比较时,如s.size()<n(n是int型负值)这个判断结果是true。尽量避免有无符号混用。
- string对象相加时要保证’+'号两侧至少有一个string对象
string s1="hello",s2="world"; string s3=s1+","+s2; //正确 string s4=s1+","+"world"; //错误
C语言中的string函数
函数 | 说明 |
---|---|
strlen( c ) | 返回c的长度,空字符不计算在内('\0') |
strcmp(c1,c2) | 比较c1和c2是否相等,c1==c2返回0;c1>c2返回正值;c1<c2返回负值 |
strcat(c1,c2) | 将c2附加到c1之后,返回c1, 即连接字符串可以直接用string中的+ |
strcpy(c1,c2) | 将c2拷贝给c1,返回c1 |
//
char ca[]={'c','+','+'};
cout<<strlen(ca)<<endl;//错误 必须以空字符作为结束的数组才能使用strlen
//
const char ca1[]="a string example";
const char ca2[]="a different string";
if(ca1<ca2){}//未定义的:试图比较两个无关地址
if(strcmp(ca1,ca2) < 0)//和两个string对象的比较s1<s2效果一样
******************************
string s("hello world")
char *str =s;//错误:不能用string对象初始化char*
const char *str = s.c_str();//正确c_strf
一般,用char数组了就不用string,用string了就别用数组。
两种输入方式
string 类型的数据 在输入后其实也可以像 char 类型的数组一样是一个连续的空间 那么就是因为这个特性 才能用scanf进行输入。那么输入的方法是:对空间的第一个元素所在的地址进行输入。那么我们早就知道对char 数组 或是 char* 空间数组的赋值方法是
char c[10];
scanf("%s\n",c);
gets(c);
***************************************
string s;
s.resize(100); //要预设长度,
scanf("%s\n",&s[0]);
printf("%s\n",s.c_str()); //输出有效字符
cout << s << endl; //剩余字符用空格补齐
或不预设长度直接,,尽量用cin赋值,scanf太多坑点
cin>>s;
cout<<s;
如果要求输入一行一行的时候,即要吞掉换行符
几种输入方式比较
cin:空格和换行都会认为是结束
string s;
cin>>s; //可以输入一个字符流 即字符串
char c[10];
cin>>c[0]; //只能输入一个字符,需借助循环
**************
scanf():回车和空格都认为结束
string s; //scanf比较坑,尽量用cin>>s输入
char c[10];
scanf("%s",c);
printf("%s",c); //表示打印字符数组c
printf("%s",&c[0]); //表示从第1个字符输出到最后
printf("%s",&c[1]); //表示从第2个字符输出到最后
***************
gets(字符数组):一直读到敲回车,不管中间是否有空格,不能读string类型
getline(cin,字符串):一直读到敲回车,不管中间是否有空格,读string类型
puts(str);//==printf("%s\n", &str);puts()在输出字符串时会将’\0’自动转换成’\n’进行输出,也就是说,puts方法输出完字符串后会自动换行。
****************
读入多行字符串时,要求回车也能继续读入:
(要注意 两个连续输入之间要加一个getchar()来吸收一个换行
单纯读入多行字符串
string str[3]; //定义二维string,此时是读三行
for(int i=0;i<3;i++)
getline(cin,str[i]);
***************************
包含其他输入后读入多行字符串
字符串:
int main()
{
string s;
int n;
cin>>n; //会产生一个和换行
getchar(); //或 cin.ignore() ,两个连续输入之间要加一个getchar()来吸收一个换行
for(int i=0;i<n;i++)
{
getline(cin,s);//如果要求输入的字符串中没有空格,可以直接cin>>s,
cout<<s<<endl;
}
return 0;
}
字符数组:
int main()
{
char ch[256];
int n;
cin>>n; //这里的cin会产生一个换行
getchar(); //因此用一个getchar()吸收掉换行。 getchar()读取输入流中的一个字符
for(int i=0;i<n;i++)
{
gets(ch);
cout<<s<<endl;
}
return 0;
}
STL——map
map是STL的一个关联容器,它提供一对一的映射关系
map<type , type> m;
map<key, value> m;
- 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
- 第二个可能称为该关键字的值(value);
自动建立key - value的对应。key 和 value可以是任意你需要的类型,包括自定义类型。
创建map对象
map是键-值对的组合,即map的元素是pair,其有以下的一些定义的方法:
map<k, v> m;
: 定义了一个名为m的空的map对象map<k, v> m2(m);
: 创建了m的副本m2map<k, v> m3(b,e);
: 创建了map对象m3,并且存储迭代器b和e范围内的所有元素的副本
map的 value的类型
是存储元素的键以及值的pair类型,键为const。
map<int, char> m; // 定义了一个名为m的空的map
map<int, char> m2(m); // 创建了m的副本m2
map<int, char> m3(m.begin(), m.end()); // 创建了map对象m3,并且存储迭代器范围内的所有元素的副本