详解请参考:string
string s;
构造函数
string str:生成空字符串,空
string s(str):生成字符串为str的复制品,复制
string s(str,strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值,截取
string s(cstr, char_len):以Char*类型cstr的前char_len个字符串作为字符串s的初值
string s(num ,c):生成num个c字符的字符串
string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值
string s(s.rbegin()
eg:
string s1;//""
string s2("12345");//"12345"
string s3("12345",0,2); //"12"
string s4(5, 'a');//"aaaaa"
string s5("123456",2)//"3456"
string s6 = "hello"//正确
string s7 = "hello"+"world"; //错误
排序
eg:
string s = "dcb"
sort(s.begin(),s.end())//从小到大 s="bcd"
反转
eg:
string s = "dcb"
reverse(s.begin(),s.end())//s="bcd"
长度
size()和length():返回string对象的字符个数,他们执行效果相同。 s.length()<==>等价于 s.size()
注: 返回值类型size_t,最好不要直接和int类型比较,如果int是负数,会转变成无符号类型,导致比较出现错误
eg:
string s = "dcb"
s.size();//3
s.length();//3
容量
max_size():返回string对象最多包含的字符数,超出会抛出length_error异常
s.max_size()//4294967294
capacity():重新分配内存之前,string对象能包含的最大字符数 s.capacity()
比较
按字典序大小比较 0:相等 1:大于 -1:小于
//方法1直接比较
string A("ABcc")//'c':99
string B("ABCc)'C':67
A > B//"1"
//方法2使用函数比较
A.compare(B)//"1"
B.compare(A)//"-1"
//比较A的"ab"和B的"ab"
A.compare(0,2,B,0,2)//"0"
插入
push_back()和insert()
string s=""
//push_back():用于在结尾插入一个字符
s.push_back('a')//s="a"
//insert():在指定位置前插入字符char
s.insert(s.begin(),'b')//s="ba"
std::string str ("hello world.");
str.front() = 'H';
str.back() = '!';
std::cout << str << '\n';//"Hello world!"
获取:
s.back()//获取最后一个字符
s.front()//获取第一个字符
遍历
//方法1:下标法
for(int i = 0 ; i < s.size(); i++){
cout <<s[i];
}
//方法2:迭代器
for(string::iterator iter = s.begin(); iter<s.end()); iter++){
cout << *iter;
}
//方法三增强for
for(auto c : s){
cout << c;
}
删除
pop_back()和erase() pop_back():删除最后一个字符 s.pop_back();
/
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个字符
/
void clear()//删除字符串所有字符
string s = "123456789"
s.erase(s1.begin()+1)//删除索引为1的字符"13456789"
s.erase(s1.begin(),s1.end()-1)//删除索引1到len-1的字符"189"
s.erase(1,6)//删除从索引1的后6个字符"189"
找子串
//找不到返回-1,pos可省略,默认从开头找 s.find(s1,pos)
从pos开始查找s中第一次出现s1的位置,并返回(包括0)
/
s.rfind(s1,pos) 从pos开始查找s中最后次出现s1的位置,并返回(包括0)
s.find_first_of(s1,pos) 从pos开始查找在s1中任意一个字符在s中第一次出现的位置,并返回(包括0)
s.find_last_of(s1,pos) 从pos开始查找在s1中任意一个字符在s中最后一次出现的位置,并返回(包括0)
s.fin_first_not_of(s1,pos) 从pos开始查找s中第一个不属于s1中的字符的位置,并返回(包括0)
s.fin_last_not_of(s1,pos) 从pos开始查找s中最后一个不属于s1中的字符的位置,并返回(包括0)
截取
string substr (size_t pos = 0, size_t len = npos)
注:如果参数值无效返回原字符串
替换
- 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
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;
交换
void swap (string& str);
stirng s1 = "apple"
string s2 = "banana"
s1.swap(s2)//s1 ="banana" s2= "apple"
转换
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
大小写转换
string str1(str.size());
transform(str.begin(),str.end(),str1.begin(),tolower)
transform(str.begin(),str.end(),str1.begin(),toupper)
//tolower(char c)和toupper(char c) c语言内置函数
自定义转换
#include <iostream>
#include <algorithm>
using namespace std;
char op(char ch)
{
if(ch>='A'&&ch<='Z')
return ch+32;
else
return ch;
}
int main()
{
string first,second;
cin>>first;
second.resize(first.size());
transform(first.begin(),first.end(),second.begin(),op);
cout<<second<<endl;
return 0;
}
分割
char str[] = "I,am,a,student; hello world!";
const char *split = ",; !";
char *p2 = strtok(str,split);
while( p2 != NULL )
{
cout<<p2<<endl;
p2 = strtok(NULL,split);
}