c_str的使用
c_str实际上就是将c++的string类型与C语言中的char* 兼容,因为在C语言中char* 字符数组表示的就是字符串。所以c_str返回的就是C语言中的const char* 类型
void test17() { //const char* c_str() const; string s("hello world"); cout << s.c_str() << endl;//c_str主要就是兼容C语言 返回的是const char*字符指针类型 } int main() { test17(); return 0; }
find和rfind的使用
find正向查找,rfind逆向查找,都可以指定pos位置作为起点,向后,向前查找指定字符C或者字符串,找到便返回下标位置,找不到返回的是npos也就是-1
void test18() { string s("hello world"); int pos = s.find('h'); //如果找不到返回的是npos 也就是-1 cout << pos << endl; pos = s.find('l', 0); cout << pos << endl; pos = s.find('l', 6); cout << pos << endl; pos = s.find("hello"); cout << pos << endl; //rfind的使用,就是从后向前开始查找 string s1("123456 123456"); pos = s1.rfind("123456"); //7 cout << pos << endl; pos = s1.rfind('1'); //7 cout << pos << endl; pos = s1.rfind('1',5); //0 cout << pos << endl; } int main() { test18(); return 0; }
substr的使用
两个参数,表示起始位置和截止位置,前闭后开 [) 截止位置为缺省参数赋值npos
1. s.substr(5) 表示从下标为5的位置开始截取到字符串s的末尾
2. s.substr(0,5) 表示截取[0,5)的s字符串
void test19() { //string substr (size_t pos = 0, size_t len = npos) const; string s("hello world"); cout << s << endl; s.substr(5); //在1str中从pos位置开始,截取n个字符,然后将其返回 cout << s.substr(5) << endl; cout << s.substr(0, 5) << endl; } int main() { test19(); return 0; }
insert的用法
insert有很多种方法,但是常用的就那些,比如在pos位置上插入字符串str,在pos位置上插入字符串str并指定该插入该字符串的元素个数,在pos位置上插入字符串str并指定从该字符串的subpos位置开始插入sublen字符,或者是
常用四种用法
- string& insert (size_t pos, const char* s); 在pos位置上插入字符串str
- string& insert (size_t pos, const char* s, size_t n); 在pos位置上插入字符串str并指定该插入该字符串的字符个数
- string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
在pos位置上插入字符串str并指定从该字符串的subpos位置开始插入sublen字符- string& insert (size_t pos, size_t n, char c); 在pos位置上插入n个字符c
void test21() { string s("hello world"); //string& insert (size_t pos, const char* s); //表示在pos位置上插入字符数组s s.insert(1, "123"); cout << s << endl; //string& insert (size_t pos, const char* s, size_t n); //表示在pos位置上插入s字符数组的前n个字符 s.insert(1, "123456",10); //如果n超过原有数组的长度,将多出来的字符位置填充'\0',相当于将这个"123456"字符串扩容为"123456\0\0\0\0" 然后插入到s对象pos位置 cout << s.size() << endl; // string& insert (size_t pos, const string& str, size_t subpos, size_t sublen); s.clear(); cout << s << endl; s.insert(0, "123456"); //如果插入数值pos的位置越界,那么就会报错 cout << s.size() << endl; cout << s << endl; //string& insert (size_t pos, size_t n, char c); //表示在pos位置上,插入n个字符c s.insert(0, 10, 'c'); cout << s << endl; } int main() { test21(); return 0; }
earse的使用
string& erase (size_t pos = 0, size_t len = npos); 从pos位置删除len个字符,len默认npos,即删除pos位置之后所有元素
iterator erase(iterator p); 删除指定迭代器位置的字符
iterator erase (iterator first, iterator last); 删除在[first,last) 之间的字符
void test22() { //1. string& erase (size_t pos = 0, size_t len = npos); string s("hello world"); cout << s << endl; s.erase(0, 6); cout << s << endl; //2. iterator erase(iterator p); s.erase(s.begin() + 3); //删除该迭代器位置的元素 cout << s << endl; //3. iterator erase (iterator first, iterator last); s.erase(s.begin() + 1, s.end()); cout << s << endl; } int main() { test22(); return 0; }
pop_back
作用为删除字符串的最后一个字符
replace的用法
replace就是对于指定区间的字符进行替换,替换为另一个字符串的内容,参数多样,顺序一般为pos,len,str,subpos,sublen,分别表示replace的字符串的指定下标,长度,要替换为的字符串str,str开始的位置,截取str的长度
主要理解就是,replace替换,需要指定空间,然后替换为str字符串形式,至于替换str字符串的那一部分,由subpos和sublen决定,从左到右,最少三个参数 pos len str。
可以由迭代器来表示范围(pos和len)如:string& replace (iterator i1, iterator i2, const char* s, size_t n);最后参数n表示替换s字符数组的个数
void test23() { string s("hello world"); //string& replace (size_t pos, size_t len, const string& str); cout << s << endl;//hello world s.replace(0, 2, "123456");//将pos位置向后的len个字符,替换成str字符串 //123456llo world cout << s << endl; //string& replace (iterator i1, iterator i2, const string& str); //可以使用迭代器,也能实现 string s1("hello world"); cout << s1 << endl; s1.replace(s1.begin(), s1.begin() + 2, "123456"); //123456llo world cout << s1 << endl; //string& replace (size_t pos, size_t len, const string& str,size_t subpos, size_t sublen); //就是将pos位置向后的len个字符,替换成从subpos位置上长度为sublen的str字符串的字符内容 //相当于substr之后的字符串替换pos的len个字符 string s2("hello world"); cout << s2 << endl;//hello world s2.replace(0,2,"123456",0,2); //12llo world cout << s2 << endl; //string& replace (size_t pos, size_t len, const char* s, size_t n); //在pos位置长度为len个字符,替换为s字符数组的前n个字符 string s3("hello world"); cout << s3 << endl;//hello world s3.replace(0, 2, "123456",2); //12llo world cout << s3 << endl; } int main() { test23(); return 0; }
string类对象非成员函数
operator+、operator>>、operator<<、getline、relational operators的使用
operator+ 少用,因为传值返回,导致深拷贝效率低
operator>>、operator<< 分别表示输入运算符重载和输出运算符重载
getline 获取一行字符串,用法为:getline(cin,s) 输入的字符串放在s内
relational operators 即比较大小,字符串可以比较大小,是根据每一字符的Ascil码值
int main() { string s; cin>>s; //这样读取字符串,读取到' '的时候就会截止 getline(cin,s); //这样除非遇到'\n' 反之不会停止读取,遇到' '也会继续读取,所以可以读取一行 cout<<s<<endl; return 0; }
总结
- string类是对应C语言中的char* 字符数组,C++中为了操作方便,提供的字符串类
- string的各种函数的用法,只需要去记住常用的一些即可。比如:append、push_back、+=、find、substr、reserve、resize、empty 、clear、c_str、insert、erase等
- 只要是涉及到范围的函数,都是前闭后开,熟练掌握string的使用即可,其扩容机制与版本环境有关。