文章目录
- 一、string的构造函数的形式
- 二、 string的大小和容量
- 三、string的字符串比较
- 注:可以就看到,当strcmp()按照字典序比较,返回值>=0时,算数运算符的比较结果为0;返回值<0时,算数运算符的比较结果为1;
- 四、string的插入(针对char)
- 五、string拼接字符串(针对string)
- 六、 string的遍历
- 七、string的删除
- 八、 string的字符替换
- string& replace(size_t pos, size_t n, const char *s);
- string& replace(size_t pos, size_t n1, size_t n2, char c);
- string& replace(iterator iter1, iterator iter2, const char* s);
- 九、字符串的分割和截取
- 十、大小写转换
- 十一、字符串排序
一、string的构造函数的形式
//生成空字符串
string();
//生成字符串str的复制品
string(const string& str);
string(const char* s);
//将字符串str中始于begin、长度为len的部分作为字符串初值,若越界则复制到字符串末尾就截至
string(const string& str, size_t begin, size_t len);
string(const char* s, size_t begin, size_t len);
//从begin_pos开始往后复制,包括begin_pos
string(const string& str, size_t begin_pos);
//从开头复制到end_pos,不包括end_pos
string(const char* s, size_t end_pos);
//复制n个c形成一个字符串
string(size_t n, char c);
实例:
void construct(){
string str1; //生成空字符串
string temp = "123456789";
string str2(temp);
string str3("123456789");
string str4(temp, 2, 4);//"3456"
string str5("123456789", 2, 4);//"3456"
string str6(temp, 2);//3456789
string str7("123456789", 2);//12
string str8(5, '1');//"11111"
cout<<"str1="<<str1<<endl;
cout<<"str2="<<str2<<endl;
cout<<"str3="<<str3<<endl;
cout<<"str4="<<str4<<endl;
cout<<"str5="<<str5<<endl;
cout<<"str6="<<str6<<endl;
cout<<"str7="<<str7<<endl;
cout<<"str8="<<str8<<endl;
}
运行结果:
注:str6和str7不同
二、 string的大小和容量
max_size()
返回string对象最多包含的字符数
size()和length()
返回string对象的字符个数。
capacity()
返回在重新申请更多的空间前字符串可以容纳的字符数。通常实际分配的空间比字符串的实际长度要大。这是一种优化,因为当我们再向原串加入一些字符(不超过原来的capacity()值)的话,就不用再次分配空间了。超过了就会重新分配空间。
reserve()
将字符串的容量设置为至少size。如果size指定的数值要小于当前字符串中的字符数, 容量将被设置为可以恰好容纳字符的数值
void len(){
string str("123456789");
cout<<"str.length()="<<str.length()<<endl;
cout<<"str.size()="<<str.size()<<endl;
cout<<"str.max_size()="<<str.max_size()<<endl;
cout<<"str.capacity()="<<str.capacity()<<endl;
str.reserve(100);
cout<<"str.length()="<<str.length()<<endl;
cout<<"str.size()="<<str.size()<<endl;
cout<<"str.max_size()="<<str.max_size()<<endl;
cout<<"str.capacity()="<<str.capacity()<<endl;
}
运行结果:
三、string的字符串比较
将字符串的字每个字符按字典顺序进行逐一做比较,可以使用 >,>=,<,<=,==,!= 等操作符进行比较,也支持const string& str 和const char* s的比较,例如str<=“123456”。还提供了成员函数compare(),返回值为1,0,-1,分别表示前者大于后者,前者等于后者,前者小于后者
成员函数compare()
void str_compare(){
string str1 = "aBcdef";
string str2 = "AbcdEf";
string str3 = "123456";
string str4 = "123dfg";
//下面是各种比较方法
//前面减去后面的ASCII码,>0返回1,<0返回-1,相同返回0
//"aBcdef"和"AbcdEf"比较
int res1 = str1.compare(str2);
//"Bcdef"和"AbcdEf"的比较,其中1表示下标索引,5表示长度
int res2 = str1.compare(1,5,str2);
//"Bcdef"和"Ef"的比较,其中4表示下标索引,2表示长度
int res3 = str1.compare(1,5,str2,4,2);
//"123"和"123"的比较
int res4 = str3.compare(0,3,str4,0,3);
cout<<"res1="<<res1<<endl;
cout<<"res2="<<res2<<endl;
cout<<"res3="<<res3<<endl;
cout<<"res4="<<res4<<endl;
}
运行结果:
算数运算符
由于底层算数运算符重载用strcmp()实现的,这里将运算符运算和strcmp()进行对比
int res5 = "9" > "1";//0
cout<<strcmp("9", "1")<<endl;//1
cout<<"res5 = "<<res5<<endl;
int res6 = "5" > "5";//0
cout<<strcmp("5", "5")<<endl;//0
cout<<"res6 = "<<res6<<endl;
int res7 = "111" > "9";//1
cout<<strcmp("111", "9")<<endl;//-1
cout<<"res7 = "<<res7<<endl;
运行结果:
注:可以就看到,当strcmp()按照字典序比较,返回值>=0时,算数运算符的比较结果为0;返回值<0时,算数运算符的比较结果为1;
四、string的插入(针对char)
push_back(char c) :在尾部插入字符c
insert(iterator p, char c):在指定位置插入字符c
;
cout<<"str创建时的地址:"<<&str<<endl;
// 尾插一个字符
str.push_back('a');
cout<<"push_back字符a后的地址:"<<&str<<endl;
str.push_back('b');
str.push_back('c');
cout<<"push_back完成:str = "<<str<<endl;
//insert(pos,char):在指定的位置pos前插入字符char
str.insert(str.begin(), '1');
cout<<"insert字符1后str = "<<str<<endl;
cout<<"insert字符1后的地址:"<<&str<<endl;
str = "123";
cout<<"连接字符串123后的地址:"<<&str<<endl;
cout<<"str = "<<str;
}
运行结果:
注:通过结果可以看到不管是push_back、insert还是直接通过 连接,字符串的地址都不变,可知并不是重新生成了一个新的对象,而是直接在内存空间里修改的
五、string拼接字符串(针对string)
append() 和 操作符
void str_joint(){
/*
string str("aaa");
str.c_str()//相当于把string对象转换成了const char*
当然 操作对于string对象和const char* 都是有效的
*/
string str1 = "123";
string str2 = "456";
cout<<"str1创建时的地址"<<&str1<<endl;
cout<<"str1 = "<<str1.append(str2)<<endl;
cout<<"append操作后str1的地址"<<&str1<<endl;
cout<<(str1 = str2)<<endl;
cout<<" 操作后str1的地址"<<&str1<<endl;
}
运行结果:
注:通过结果可以看到不管是append还是直接通过 连接,字符串的地址都不变,可知并不是重新生成了一个新的对象,而是直接在内存空间里修改的
六、 string的遍历
索引方式或迭代器都能实现遍历
void str_traverse(){
string str("123456");
//索引法一
for(int i=0; i<str.length(); i )
cout<<str[i]<<" ";
cout<<endl;
//索引法二
const char* c = str.c_str();
for(int i=0; i<strlen(c); i )
cout<<c[i]<<" ";
cout<<endl;
// //正向迭代器
string::iterator iter = str.begin();
while(iter < str.end()){
cout<<*iter<<" ";
iter++;
}
cout<<endl;
//反向迭代器
string::reverse_iterator riter = str.rbegin();
while(riter < str.rend()){
cout<<*riter<<" ";
riter++;
}
cout<<endl;
}
运行结果:
七、string的删除
1、从给定起始位置pos处开始删除, 要删除字符的长度为n, 返回值修改后的string对象引用
basic_string & erase(size_type pos=0, size_type n=npos);
示例:
= "0123456789";
// 从位置pos=5处开始删除,包括位置5,直到结尾,剩余01234
str1.erase(5);
cout<<str1<<endl;
string str2 = "0123456789";
// 从位置pos=4处开始,删除3个字符,包括位置4,剩余0123789
//若越界,直接删除到末尾
str2.erase(4, 3);
cout<<str2<<endl;
运行结果:
2、删除迭代器位置处的单个字符, 并返回下个元素的迭代器
iterator erase(const_iterator position)
示例:
= "0123456789";
// 删除str初始位置的字符
str.erase(str.begin());
cout<<str<<endl;
3、删除迭代器[first, last)区间的所有字符,返回一个指向被删除的最后一个元素的下一个字符的迭代器
iterator erase(const_iterator first, const_iterator last)
// 删除str从位置5开始,包括位置5,到末尾的所有字符,剩余01234
string str = "0123456789";
str.erase(str.begin()+5, str.end());
cout<<str<<endl;
4、删除string中最后一个的字符
pop_back()
string str = "1234";
str.pop_back();//剩余123,新特性,若报错,则要更新MinGW
八、 string的字符替换
1、 将当前字符串从pos索引开始的n个字符,替换成字符串s
string& replace(size_t pos, size_t n, const char *s);
2、将当前字符串从pos索引开始的n1个字符,包括第n1个字符,替换成n2个字符c
string& replace(size_t pos, size_t n1, size_t n2, char c);
3、将当前字符串[iter1,iter2)区间中的字符串替换为字符串s
string& replace(iterator iter1, iterator iter2, const char* s);
void str_replace(){
string str1 = "0123456789";
// string& replace(size_t pos, size_t n, const char *s)
str1.replace(6, 5, "haha"); //012345haha
cout<<str1<<endl;
string str2 = "0123456789";
//string& replace(size_t pos, size_t n, const char *s)
str2.replace(str2.size()-1, 1, 3, 'a');//012345678aaa
cout<<str2<<endl;
string str3 = "0123456789";
//string& replace(iterator iter1, iterator iter2, const char* s)
str3.replace(str3.begin(),str3.begin() 5,"haha"); //haha56789
cout<<str3<<endl;
}
运行结果:
九、字符串的分割和截取
分割函数: char *strtok(char *s,const char *delim)
功能:分解字符串为一组字符串,s为要分解的字符串,delim为分隔字符串
分析:strtok()用来将字符串分割成一个个片段,参数s指向将要被分隔的字符串,参数delim则为分隔字符串。当strtok()在参数s的字符串中发现到参数delim的分隔字符时,则会将该字符改为’\0’字符。在第一次调用时,strtok()必须给予参数s字符串,往后的调用则将参数s设置成NULL,每次调用成功则返回被分隔片段的指针
void str_tok_sub(){
char str[] = "I,am,from,shannxi.as a C programmer!";
const char *split = ", .!";
//在第一次调用时,strtok()必须给予参数s字符串
char *p2 = strtok(str,split);
while( p2 != NULL )
{
cout<<p2<<endl;
//往后的调用则将参数s设置成NULL,每次调用成功则返回被分隔片段的指针
p2 = strtok(NULL,split);
}
}
运行结果:
截取:
1、str字符串begin的位置开始截取到str末尾,包括位置begin
string str.substr(size_t begin)
2、从str字符串begin位置开始截取len个字符,包括位置begin,若越界则截取到str末尾
string str.substr(size_t begin, size_t len)
str2("0123456789");
string res1 = str2.substr(5); //56789
string res2 = str2.substr(1,5); //12345
cout<<res1<<endl;
cout<<res2<<endl;
注:截取操作不改变原字符串
十、大小写转换
tolower()和toupper()
void str_trans(){
string str = "ABCDE";
for( int i = 0; i < str.size(); i )
str[i] = tolower(str[i]);
cout<<str<<endl;//abcde
for( int i = 0; i < str.size(); i )
str[i] = toupper(str[i]);
cout<<str<<endl;//ABCDE
}
运行结果:
十一、字符串排序
最后一个了,比较简单,直接给代码吧
void str_sort(){
string str("9128765340");
sort(str.begin(), str.end());//按照字典序排序
cout<<str<<endl;//0123456789
}