电子学会二级-字符串-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(); 
} 
posted @ 2022-06-02 10:58  new-code  阅读(25)  评论(0编辑  收藏  举报