目录
1. 初始化
-
string str——构造空的string类对象,即空字符串
-
string s(str):生成字符串为str的复制品
-
string str("ABCDE")——等价于 str="ABCDE"
-
string s(cstr, char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值
string str("ABCDE", 4) //str = "ABCD"
- string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值
string str("ABCDE", 1, 3) // str = "BCD"
- string s(num ,c):生成num个c字符的字符串
string str(5, 'A') // str = "AAAAA"
- string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值
string str("ABCDEF", 1) // str = "BCDEF"
- string s7(str.begin(), str.begin()+num); //区间str.begin()和str.begin()+num内的字符作为初值
2. 对string对象进行赋值
可以用 char* 类型的变量、常量,以及 char 类型的变量、常量对 string 对象进行赋值。例如:
string s1;
s1 = "Hello"; // s1 = "Hello"
s2 = 'K'; // s2 = "K”
(不常用)
string 类还有 assign 成员函数,可以用来对 string 对象赋值。assign 成员函数返回对象自身的引用。例如:
string s1("12345"), s2;
s3.assign(s1); // s3 = s1
s2.assign(s1, 1, 2); // s2 = "23",即 s1 的子串(1, 2)
s2.assign(4, 'K'); // s2 = "KKKK"
s2.assign("abcde", 2, 3); // s2 = "cde",即 "abcde" 的子串(2, 3)
3. 增
- string &insert(int p, const string &s)--在p位置插入字符串s
str.insert(2,"ABC"); //在str下标为2的位置添加字符串"ABC"
str.insert(2,3,'A'); //在str下标为2的位置添加3个字符'A'
str.insert( iterator pos, size_type count, CharT ch ); //在 str 中,迭代器指向的pos位置插入count个字符ch
s4.insert(++str1.begin(),2,'a'); //结果:s4:ABCD->AaaBCD
//下面的不常用
str.insert(2,"ABC",1); //在str下标为2的位置添加字符串 "ABC" 中1个字符
str.insert(2,"ABC",1,1); //在str下标为2的位置添加字符串 "ABC" 中从位置1开始的1个字符
str.insert( iterator pos, InputIt first, InputIt last); //在 str 中,pos位置 插入str1 的开始位置到结束为止
s4.insert(s4.begin(),str1.begin(),str1.end()); //结果:s4:ABCD str1:abc->abcABCD
- +=
str += "ABC" //在str后拼接"ABC",也可拼接字符
- append(string str)--/在str末尾添加一个字符串 str,参数必须是字符串形式
str.append("ABC") //在str末尾添加一个字符串 "ABC",参数必须是字符串形式
- pack_push(char c)--在str末尾添加一个字符c ,参数必须是字符形式
str.push_back('A') //在str末尾添加一个字符 'A' ,参数必须是字符形式
4. 删
-
iterator erase(iterator p);//删除字符串中p所指的字符
-
iterator erase(iterator first, iterator last);//删除字符串中迭代器区间[first,last)上所有字符
-
string& erase(size_t pos = 0, size_t len = npos);//删除字符串中从索引位置pos开始的len个字符
注:可以用迭代器操作,也可以用下标操作
string s1("Real Steel");
s1.erase(1, 3); //删除子串[1, 4),此后 s1 = "R Steel"
s1.erase(5); //删除下标5及其后面的所有字符,此后 s1 = "R Ste"
5. 改
-
string& replace(size_t pos, size_t n, const char *s);//将当前字符串从pos索引开始的n个字符,替换成字符串s
-
string& replace(size_t pos, size_t n, size_t n1, char c); //将当前字符串从pos索引开始的n个字符,替换成n1个字符c
-
string& replace(iterator i1, iterator i2, const char* s);//将当前字符串[i1,i2)区间中的字符串替换为字符串s
注:1、(m,n)子串表示m开始长度为n的子串。2、可以用迭代器操作,也可以用下标操作
string s1("hello,world!");
cout<<s1.size()<<endl; // 结果:12
s1.replace(s1.size()-1,1,1,'.'); // 结果:hello,world.
// 这里的6表示下标 5表示长度
s1.replace(6,5,"girl"); // 结果:hello,girl.
// s1.begin(),s1.begin()+5 是左闭右开区间
s1.replace(s1.begin(),s1.begin()+5,"boy"); // 结果:boy,girl.
cout<<s1<<endl;
6. 查
- find()--从前往后查找子串或字符出现的位置。
- rfind()-从后往前查找子串或字符出现的位置。
size_t find (const char* s, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找子串s,返回找到的位置索引,-1表示查找不到子串
size_t find (char c, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找字符c,返回找到的位置索引,-1表示查找不到字符
size_t rfind (const char* s, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引,-1表示查找不到子串
size_t rfind (char c, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引,-1表示查找不到字符
string s("dog bird chicken bird cat");
//字符串查找-----找到后返回首字母在字符串中的下标
// 1. 查找一个字符串
cout << s.find("chicken") << endl; // 结果是:9
// 2. 从下标为6开始找字符'i',返回找到的第一个i的下标
cout << s.find('i',6) << endl; // 结果是:11
// 3. 从字符串的末尾开始查找字符串,返回的还是首字母在字符串中的下标
cout << s.rfind("chicken") << endl; // 结果是:9
// 4. 从字符串的末尾开始查找字符
cout << s.rfind('i') << endl; // 结果是:18-------因为是从末尾开始查找,所以返回第一次找到的字符
7. string的容量与大小
int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)
int max_size()const; //返回string对象中可存放的最大字符串的长度
int size()const; //返回当前字符串的大小
int length()const; //返回当前字符串的长度
bool empty()const; //当前字符串是否为空
void resize(int len,char c); //把字符串当前大小置为len,多去少补,多出的字符c填充不足的部分,如果不填char c参数,会用'\0'补全
8. string遍历
string s1("abcdef"); // 调用一次构造函数
// 方法一: 下标
for( int i = 0; i < s1.size() ; i++ )
{
cout<<s1[i];
}
cout<<endl;
// 方法二:正向迭代器
string::iterator it;
for(it = s1.begin() ; it < s1.end() ; it++)
{
cout<<*it;
}
cout<<endl;
// 方法三:反向迭代器
string::reverse_iterator rit;
for(rit = s1.rbegin(); rit < s1.rend() ; rit++)
{
cout<<*rit;
}
cout<<endl;
9. string大小写转化
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
string input;
string lower,upper;
cin >> input;
lower.resize(input.size());
upper.resize(input.size());
transform(input.begin(), input.end(), lower.begin(), ::tolower);
transform(input.begin(), input.end(), upper.begin(), ::toupper);
cout << "Tolower Result :" << endl << lower << endl;
cout << "Toupper Result :" << endl << upper << endl;
return 0;
}
10. string分割--substr()
- string substr(int n = 0, int m = string::npos) const;
用于求子串 [n, n+m),调用时,如果省略 m 或 m 超过了字符串的长度,则求出来的子串就是从下标 n 开始一直到字符串结束的部分
string s1 = "this is ok";
string s2 = s1.substr(2, 4); // s2 = "is i"
s2 = s1.substr(2); // s2 = "is is ok"
11. string转char* 、char[]
char buf[10];
string str("ABCDEFG");
strcpy(buf, str.c_str());
12. char* 、char[]转string
方法1:
char ch [] = "ABCDEFG";
string str(ch);//也可string str = ch;
方法2:
char ch [] = "ABCDEFG";
string str;
str = ch;//在原有基础上添加可以用str += ch;
13. 其他常用函数
void swap(string &s2); //交换当前字符串与s2的值
const char *data()const; //返回一个非null终止的c字符数组,data():与c_str()类似,用于string转const char*其中它返回的数组是不以空字符终止,
compare(string s)//s与当前字符串完全相等返回0;完全不等返回小于0;部分相等返回大于0
reverse(str.begin(),str.end())//str的开始到结束字符反转,注意加头文件<algorithm>