【string类常见接口】
string类
- 1、constructor
- 2、[ ]
- 3、迭代器遍历
- 4、范围for遍历
- 5、sort排序
- 6、push_back 、 append、 +=
- 7、Insert,erase
- 8、reserve、resize、c_str
- 9、find 、substr、string比较大小
1、constructor
构造函数有7个,常用有3个分别为:
string();这个是没有参数的默认构造,也就是自动会调用这个构造函数。
string(const string& str);拷贝构造
string(const char* s);常用构造函数,写字符串即可。
string(const string& str,size_t pos,size_t len = npos);这个拷贝构造函数,pos为下标的位置,len为长度。
string(const char* s,size_t n);构造字符串几个字符。
string(size_t n,char c);
string(InputIterator first,InputIterator last )
void string_test1()
{//construct test//string() 调用默认构造(无参,缺省参数,编译器自动形成的构造)string s1;//<<这个不能输出自定义类型//这儿是操作符重载了,并且要写成全局//然后定义成类的friend,就可以访问私有cout << s1 << endl;//string(const char*s)string s2("hello world");cout << s2 << endl;//string(const string& str)(拷贝构造)string s3 = s2;cout << s3 << endl;//string(const string& str,size_t pos,size_t len = npos)string s4(s2, 1);cout << s4 << endl;//string(const char*s ,size_t n)string s5("hello bit",8);cout << s5 << endl;//string(size_t n,char c)string s6(4, 'x');cout << s6<< endl;//string(InputIterator first,InputIterator last)string s7(s2.begin() + 1, s2.end() - 1);cout << s7 << endl;
}
//const string& s
//引用传参,是参数的别名
//理解为s和参数里的数据是同一块空间
void push_back(const string& s)
{}
void string_test2()
{//隐式类型转换+拷贝构造string s1 = "hello world";const string& s2 = "hello world";//push_back(s2);push_back("hello world");push_back(s1);
}
2、[ ]
void string_test3()
{//用[]访问stringstring s1("hello world");//1.char& operator[](size_t pos)//2.const char& operator(size_t pos) consts1[0] = 'x';//size_t size() const// return the length of the string,in terms of bytes//被const修饰 size_t size(string* const this) constfor (size_t i = 0; i < s1.size();i++){cout << ++s1[i] << " ";}cout << endl;const string s2("hello world");//s2[0] = 'y';
}
[]运算符重载提供了两个接口,一个可读可写,一个只可读。
char& operator[](size_t pos) //可读可写
const char& operator(size_t pos) const;只能读,*this被const修饰,内容不可变,接受的返回值必须是常量char&,也不可变。
3、迭代器遍历
void string_test4()
{//<<符号重载//ostream& operator<<(ostream& os,const string& str)//os->coutstring s1("hello world");//iterator begin()//const_iterator begin()const//Return iterator to beginning//Returns an iterator pointing to the first character of the stringstring::iterator it1 = s1.begin();//iterator end()//const_iterator end() constwhile (it1 != s1.end()){cout << *it1 << " ";it1++;}cout << endl;//reverse 颠倒//reverse_iterator rbegin()//const_reverse_iterator rbegin() const//reverse_iterator rend()//const_reverse_iterator rend() conststring::reverse_iterator rit1 = s1.rbegin();while (rit1 != s1.rend()){cout << *rit1 << " ";rit1++;}cout << endl;
}
迭代器有两个,一个正向迭代器,一个反向迭代器
4、范围for遍历
void string_test5()
{string s1("hello world");for (auto e : s1){cout << e << " ";}cout << endl;for (auto& e : s1){e += 1;}for (auto e : s1){cout << e << " ";}cout << endl;
}
5、sort排序
string类中按字符ASCII码排序,传迭代器
void string_test6()
{//按字典序排序string s1("hello world");cout << s1 << endl;sort(s1.begin(), s1.end());cout << s1 << endl;
}
6、push_back 、 append、 +=
void string_test7()
{string s1("hello world");cout << s1 << endl;//push_back尾插//void push_back(char c)//append 附加//Appends character c to the end of the string//increasing its length by ones1.push_back('x');cout << s1 << endl;s1.append("yyyyyyyyyyyy");cout << s1 << endl;//符号重载+=//1.string& operator+=(const string& str)//2.string& operator+=(const char* s)//3.string& operator+=(char c)//"+="接口把能想到的全部设计进去了string s2("MMMNNN");s1 += 'y';s1 += "PPPPQQQQ";s1 += s2;cout << s1 << endl;
}
pash_back尾插一个字符,append尾插一个字符串,功能很多。+=是运算符重载,接口很多,能想到的都设计进去了,比如+=string,+=字符,+=字符串
7、Insert,erase
void string_test8()
{string s1("hello world,");cout << s1 << endl;//assign :分派//assigns a new value to the string,replacing its//current contentss1.assign("xxxxxxxyyyyyyyyyy");cout << s1 << endl;//insert// 要挪动位置,慎用->O(N)//string& insert(size_t pos,const string& str)string s2(" hello bit!");s1.insert(s1.size(), s2);cout << s1 << endl;//string& insert(size_t pos,const char* s)s1.insert(0, "kkkkk ");cout << s1 << endl;//string& insert(size_t pos,size_t n,char)s1.insert(0, 1, 'F');cout << s1 << endl;
}void string_test9()
{string s1("hello world");cout << s1 << endl;//erase//string& erase(size_t pos = 0,size_t len = npos)//iterator erase(iterator p)//iterator erase(iterator first,iterator last)s1.erase(s1.size()-1);cout << s1 << endl;//replace 替代//string& replace(size_t pos,size_t len,const string& str)//string& replace(size_t pos,size_t len,const char* s)//string& replace(size_t pos,size_t len,const char c)string s2("MMMMMNNNNN");s1.replace(0, 0, s2);cout << s1 << endl;
}
insert设计的很灵活,第一个参数size_t pos,从哪个位置插入,第二个参数插入什么,字符串,string,字符。erase,第一个参数是从哪个位置删除,第二个参数,删除多少个字符。
8、reserve、resize、c_str
reserve设置容量,resize设置大小,resize既影响容量,有影响大小。
void test_string17()
{string s1("11111");string s2("11111111111111111111111111111111111111");cout << s1.capacity() << endl; //15//reserve保留//reverse 逆置,反转s1.reserve(100); //设置容量//知道需要多少空间,提前开-->reverse//s1[100] = 'x'; 这样写不可以,因为[]会调用 char& operator[](size_t pos)cout << s1.capacity() << endl; //111
}void test_string18()
{string s1;//既设置size,又扩容了,string机制决定//resize设置存储字符的大小s1.resize(5, '0');s1[4] = '3';s1[3] = '4';s1[2] = '5';s1[1] = '6';s1[0] = '7';cout << s1 << endl;string s2("hello world");//尾插s2.resize(20, 'x');cout << s2 << endl;//删除//把字符删除了,不能缩容s2.resize(5);string file("Test.cpp");//file.c_str()获取file字符串的地址FILE* fout = fopen(file.c_str(), "r");char ch = fgetc(fout);while (ch != EOF){cout << ch;ch = fgetc(fout);}
}
9、find 、substr、string比较大小
void test_string19()
{//find找位置,substr找子串//size_t find(const string& str,size_t pos = 0)const//size_t find(char c,size_t pos = 0)const//return //The position of the first character of the first match.//If no matches were found,the function returns string::npos(-1).string file("string.cpp.zip");size_t pos = file.rfind('.');//"Helloworld" 10个字符//substr获取子串//string substr(size_t pos = 0,size_t len = npos)const//return //A string object with a substring of this objectstring suffix = file.substr(pos, file.size() - pos);cout << suffix << endl;cout << "************************************************************************" << endl<<endl;string url("https://gitee.com/ailiangshilove/cpp-class/blob/master/%E8%AF%BE%E4%BB%B6%E4%BB%A3%E7%A0%81/C++%E8%AF%BE%E4%BB%B6V6/string%E7%9A%84%E6%8E%A5%E5%8F%A3%E6%B5%8B%E8%AF%95%E5%8F%8A%E4%BD%BF%E7%94%A8/TestString.cpp");size_t pos1 = url.find(':'); //find找到:位置后,返回:的下标string url1 = url.substr(0, pos1 - 0);cout << url1 << endl;size_t pos2 = url.find('/', pos1 + 3);string url2 = url.substr(pos1+3, pos2-pos1-3); //右开-左闭cout << url2 << endl;string url3 = url.substr(pos2 + 1);cout << url3 << endl;
}void string_test20()
{string s1 = "hello";string s2 = "world";string ret1 = s1 + s2;cout << ret1 << endl;string ret2 = s1 + "xxxxxxxx";cout << ret2 << endl;string ret3 = "xxxxxxxx" + s1;cout << ret3 << endl;//字典序比较cout << (s1 < s2) << endl;
}