电子学会二级-字符串-string
电子学会二级-字符串-string
#include<bits/stdc++.h>
using namespace std;
/*
构造函数
string s1(); // si = ""
string s2("abcdef"); // s2 = "abcd"
string s3(4, 'a'); // s3 = "aaaa"
string s4("abcdef", 1, 3); //s4 = "bcd",即 "abcdef" 的从下标 1 开始,长度为 3 的子串
string没有数字和字符构造函数
string s('a') 和string s(12) 都是错误的
*/
void test1(){
string s2("abcdef");
cout<<s2<<endl;
string s3(4, 'a');
cout<<s3<<endl;
string s4("abcdef", 1, 3);
cout<<s4<<endl;
}
/*
对象赋值
可以用 char* 类型的变量、常量,以及 char 类型的变量、常量对 string 对象进行赋值
*/
void test2(){
string s;
s="abcdef";
cout<<s<<endl;
s='a';//字符可以赋值给string
cout<<s<<endl;
s=65;//可以把合法的ascii赋值给string
cout<<s<<endl;
char *p;//指针变量p
char q;//变量q
p=&q;//p指向q变量地址
*p='a';//通过指针p赋值q变量位a
s=*p;//p指向变量q对应字符赋值给s
cout<<s<<endl;
}
/*
assign 函数赋值
*/
void test3(){
string s("12345"), st="abc";
cout<<s<<endl;
s.assign(st);// s = st st赋值给s
cout<<s<<endl;
s.assign(st, 0, 2);// s2 = "bc" 取字串从0开始取两个 ab
cout<<s<<endl;
s.assign(4, 'a');// s = "aaaa" 用4个a赋值
cout<<s<<endl;
s.assign("abcde", 2, 3);// s2 = "cde" 从2开始取3个字符 cde
cout<<s<<endl;
}
/*
求字符串的长度 length size
*/
void test4(){
string s="abcdefghi";
cout<<s.length()<<endl;
cout<<s.size()<<endl;
cout<<sizeof(s)<<endl;//string是指不能使用sizeof
int a[]={1,2,3,4};
cout<<sizeof(a)/sizeof(a[0])<<endl;//字符数组占用字节数/第一个字符占用数组字节数
char c[]={'a','b','c','d','e'};
cout<<sizeof(c)/sizeof(c[0])<<endl;//字符数组占用字节数/第一个字符占用数组字节数
cout<<strlen(c)<<endl<<endl;//字符数组长度
}
/*
字符串连接 + append insert
*/
void test5(){
string temp="efg";
string str="abcd";
str=str+temp;
cout<<str<<endl;
str.append("hi");//str 后面追加temp整个字符串
cout<<str<<endl;
str.append(temp,1,1);//在str后面追加temp从1位置开始的1个字符
cout<<str<<endl;
str.append(3,'k');//str后面追加3个字符k
cout<<str<<endl;
str.insert(2,"123");//在第2个位置前插入123
cout<<str<<endl;
}
/*
字符串比较 < <= == != >= > compare
compare
小于 0 表示当前的字符串小
等于 0 表示两个字符串相等
大于 0 表示另一个字符串小
*/
void test6(){
string str1="hello",str2="hello,world";
int ret=str1.compare(str2);
cout<<ret<<endl;
//比较字串
ret=str1.compare(1,2,str2,0,3);//el hel
cout<<ret<<endl;
ret=str1.compare(0,2,str2,1,2);//he el
cout<<ret<<endl;
str1="hello",str2="hello";
ret=str1.compare(str2);
cout<<ret<<endl;
}
/*
字符串比较 < <= == != >= >
1.从第一个字母开始比较 按字典序比较
2.完全相同 则相等
3.如果前缀相同 字符串长的大
*/
void test7(){
string str1="abcd",str2="bcde";
if(str1==str2){
cout<<str1<<"="<<str2<<endl;
}else if(str1<str2){
cout<<str1<<"<"<<str2<<endl;
}else{
cout<<str1<<">"<<str2<<endl;
}
str1="abcd",str2="abcd";
if(str1==str2){
cout<<str1<<"="<<str2<<endl;
}else if(str1<str2){
cout<<str1<<"<"<<str2<<endl;
}else{
cout<<str1<<">"<<str2<<endl;
}
str1="bacd",str2="abcd";
if(str1==str2){
cout<<str1<<"="<<str2<<endl;
}else if(str1<str2){
cout<<str1<<"<"<<str2<<endl;
}else{
cout<<str1<<">"<<str2<<endl;
}
str1="hello",str2="hello,world";
if(str1==str2){
cout<<str1<<"="<<str2<<endl;
}else if(str1<str2){
cout<<str1<<"<"<<str2<<endl;
}else{
cout<<str1<<">"<<str2<<endl;
}
}
/*
子串 substr
str.substr(1,5) 从第一个位置开始 取5个字符
str.substr(1) 从第一个位置开始 取到结尾的所有字符
*/
void test8(){
string str="abcdefg";
cout<<str<<endl;
string temp=str.substr(1,5);//bcdef
cout<<temp<<endl;
temp = str.substr(1);//bcdefg
cout<<temp<<endl;
}
/*
字符串交换
*/
void test9(){
string str1="abcd",str2="efg";
cout<<str1<<" "<<str2<<endl;
str1.swap(str2);
cout<<str1<<" "<<str2<<endl;
swap(str1,str2);//字符串str1 str2交换
cout<<str1<<" "<<str2<<endl;
swap(str1[1],str1[2]);//字符串str1 的1和2位置元素交换
cout<<str1<<" "<<str2<<endl;
}
/*
字符串替换
*/
void test10(){
string str = "hello world";
string str2 = "hard ";
string str3 = "it is so happy wow";
//s.replace(p0,n0,n,ch) 删除p0开始的n0个字符,然后在p0处插入n个字符ch
str.replace(0,6,4,'z'); // str = "zzzzworld" 从0开始的6个字符用zzzz替换--zzzzworld
cout<<str<<endl;
//s.replace(p0,n0,str) 删除从p0开始的n0个字符,然后在p0处插入字符串str
str.replace(0,6,str2); // str = "hard rld" 从0开始的6个字符用hard 替换hard rld
cout<<str<<endl;
//s.replace(p0,n0,str,pos,n) 删除p0开始的n0个字符,然后在p0处插入字符串str中从pos开始的n个字符
str.replace(0,6,str3,6,9); // str = "so happy ld" --so happy ld
cout<<str<<endl;
//s.replace(p0,n0,cstr,n) 删除p0开始的n0个字符,然后在p0处插入字符数组cstr的前n个字符
//此处不可将"it is so happy wow"替换为str3
str.replace(0,6,"it is so happy wow",6);// str = "it is world" --it is py ld
cout<<str<<endl;
}
/*
字符串删除
*/
void test11(){
string str="hello world";
str.erase(1,3);//删除1位置开始的3个字符 --ho world
cout<<str<<endl;
str="hello world";
str.erase(6);//删除从6开始的后面字符
cout<<str<<endl;
}
/*
查找字串 字符
*/
void test12(){
string str = "The apple thinks apple is delicious"; //长度34
string key = "apple";
//s.find(str) 查找字符串str在当前字符串s中第一次出现的位置
int pos1 = str.find(key); // 4
cout<<pos1<<endl;
//s.find(str,pos) 查找字符串str在当前字符串s的[pos,end]中第一次出现的位置
int pos2 = str.find(key, 10); // 17
cout<<pos2<<endl;
//s.find(cstr,pos,n) 查找字符数组cstr前n的字符在当前字符串s的[pos,end]中第一次出现的位置
//此处不可将"delete"替换为str2(如果定义str2 = "delete")
int pos3 = str.find("delete", 0, 2); // 26 查找delete 前两个字符在str出现的位置
cout<<pos3<<endl;
//s.find(ch,pos) 查找字符ch在当前字符串s的[pos,end]中第一次出现的位置
int pos4 = str.find('s', 0); // 15
cout<<pos4<<endl;
}
/*
迭代器访问
*/
void test13(){
string s("afgcbed");
string::iterator p = find(s.begin(), s.end(), 'c');
if (p!= s.end())
cout << p - s.begin() << endl; //输出 3
sort(s.begin(), s.end());
cout << s << endl; //输出 abcdefg
next_permutation(s.begin(), s.end());
cout << s << endl; //输出 abcdegf
}
int main(){
// test1();
// test2();
// test4();
// test5();
// test6();
// test7();
// test8();
// test9();
// test10();
// test11();
// test12();
test13();
}
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习