在了解了STL之后,先开始介绍string。String类最开始并不属于STL,但是它在c++标准库中的作用与STL紧密相连,于是成为了STL的一员(string和STL的关系讨论参考:string和STL)
ps:string接口很多(有一点点冗余,红色加粗表示一定要会,加粗表示要了解)
1.成员函数(Members functions)
1.1构造函数(constructor)
string的构造有很多方式:
std::string s0("Initial string"); // 传参构造
std::string s1; // 无参构造
std::string s2(s0); // 拷贝构造
std::string s3(s0, 8, 3); // 指定位置拷贝构造指定个数个字符
std::string s4("A character sequence");
std::string s5("Another character sequence", 12); // 从给定字符中拷贝指定个数个字符
std::string s6a(10, 'x'); // 构造N个字符
std::string s6b(10, 42); // '*'的ASCII码是42
std::string s7(s0.begin(), s0.begin() + 7); // 从string的指定位置开始拷贝指定个数个字符
1.2赋值重载(=)
string重载赋值符号=,可以直接用一个已经存在的string拷贝赋值给另一个存在的string。
std::string str1, str2, str3;
str1 = "Test string: "; // c-string
str2 = 'x'; // single character
str3 = str1 + str2; // 两个string相加后赋值给str3
2.迭代器(iterator)
begin:返回string的第一个位置
end:返回string最后一个字符的下一个位置
rbegin:返回最后一个字符
rend返回第一个字符的前一个位置
const string的使用在前面+c即可(cbegin、cend、crbegin、crend)
string str0("hello world");
string::iterator itb = str0.begin();
string::reverse_iterator ritb = str0.rbegin();
string::iterator ite = str0.end()-1;
string::reverse_iterator rite = str0.rend() - 1;
cout << "str0.begin():" << *itb << endl;
cout << "str0.rbegin():" << *ritb << endl;
cout << "str0.end():" << *ite << endl;
cout << "str0.rend():" << *rite << endl;
3.容器(capacity)
size:string的长度(不包括结束符 ‘\0’ )
length:string的长度(和size一样)
max_size:string能储存的最大值(具体取决于系统和库的实现)
resize(n):设置string的size(如果n < 当前size,那么string的size会减小到n,若是n > size,会扩容)
capacity:string的容量(具体取决于编译器的开辟方式和扩容方式)
reserve(n):设置string的capacity为所给值(reserve不会影响到string原来的值),如果n < 当前size,那么不会减小;如果n > capacity,那么会扩容(具体怎么扩容取决于编译器);如果n介于size和capacity,是否扩容取决于编译器
clear:清除string的size
empty:判断string是否为空(size是否为0)
shrink_to_fit:将capacity减小到size
string str0("hello world");
cout << "原str0:" << str0 << endl;
cout << "size:" << str0.size() << endl;
cout << "len:" << str0.length() << endl;
cout << "capcity:" << str0.capacity() << endl;
cout << "max_size:" << str0.max_size() << endl;
cout << "-----------------------------" << endl;
str0.resize(5);
str0.reserve(40);
cout << "str0 size 置为5,容量置为40后:" << str0 << endl;
cout << "size:" << str0.size() << endl;
cout << "len:" << str0.length() << endl;
cout << "capcity:" << str0.capacity() << endl;
cout << "max_size:" << str0.max_size() << endl;
cout << "-----------------------------" << endl;
str0.shrink_to_fit();
cout << "str0.shrink_to_fit():" << str0 <<endl;
cout << "size:" << str0.size() << endl;
cout << "len:" << str0.length() << endl;
cout << "capcity:" << str0.capacity() << endl;
cout << "max_size:" << str0.max_size() << endl;
cout << "-----------------------------" << endl;
str0.clear();
cout << "str0.clear():" << str0 << endl;
cout << "size:" << str0.size() << endl;
cout << "len:" << str0.length() << endl;
cout << "capcity:" << str0.capacity() << endl;
cout << "max_size:" << str0.max_size() << endl;
cout << "-----------------------------" << endl;
4.元素访问符(element acess)
operator[ ]:下标访问符,可以返回string中的指定位置(和数组一样,从0开始)
at:返回下标为所给值的字符
back:返回最后一个字符
front:返回第一个字符
string str0("hello world");
for (int i = 0; i < str0.size(); i++)
{
cout << str0[i];
}
cout << "\n";
cout << "str0.at(6): " << str0.at(6) << endl;
cout << "str0.back(): " << str0.back() << endl;
cout << "str0.front(): " << str0.front() << endl;
cout << "-----------------------------" << endl;
5.修饰符(modifiers)
operator+=:拼接字符
append:添加一个子串
push_back:尾插一个字符
assign:将string内容置为指定内容
insert:插入字符
erase:清除string内容(包括size)
swap:交换两个string
pop_back:删除string的最后一个字符
string str0("hello world");
string str1("hello");
str1.append(" ");
str1 += ("world");
str1.push_back('!');
cout << "str1: " << str1 << endl;
cout << "-----------------------------" << endl;
str1.assign("hello");
cout << "str1: " << str1 << endl;
str1.insert(5," world!");
cout << "str1: " << str1 << endl;
cout << "-----------------------------" << endl;
str1.swap(str0);
cout << "swap str1 str0:\n";
cout << "str0: " << str0 << endl;
cout << "str1: " << str1 << endl;
cout << "-----------------------------" << endl;
str0.pop_back();
cout << "pop_back str0:\n";
cout << "str0: " << str0 << endl;
cout << "-----------------------------" << endl;
str0.erase();
str1.erase();
cout << "erase str1 str0:\n";
cout << "str0: " << str0 << endl;
cout << "str1: " << str1 << endl;
6.字符操作(string operation)
c_str:返回指向string内容的指针
data:获取string的字符
get_allocator:返回string的空间分配器
copy:拷贝string中的序列
find:查找字符在string中的位置
rfind:从最后一个位置开始查找
find_first_of:查找在string中出现的字符
find_last_of:从最后一个字符开始查找
find_first_not_of:查找在string中没有出现的字符(返回的是string和所给字符比对时不匹配的第一个下标)
find_last_not_of:从最后一个字符开始查找
substr:截取string中的子字符,可以直接赋值给新的string
compare:比较两个string的内容(相等返回0,大于返回1,小于返回-1)
string str1("Please, replace the vowels in this sentence by asterisks.");
size_t found = str1.find_first_of("aeiou");
while (found != string::npos)
{
str1[found] = '*';
found = str1.find_first_of("aeiou",found + 1);
}
cout << "str1: " << str1 << endl;
string str2("C:\\Program Files\\Microsoft Office\\root\\Office16\\EXCEL.EXE");
size_t pos = str2.find_last_of('.');
cout << "str2: " << str2 << endl;
cout << "str2 suffix: " << str2.c_str() + pos + 1 << endl;
cout << "str2 path: " << str2.substr(0,pos) << endl;
7.成员常量(members constants)
npos:size_t最大值(18446744073709551615)
8.非成员函数重载 (non-member overloads)
operator+:可以直接将两个string相加,还有类似的比较等等,如下:
swap:可以交换两个string
operator>>:可以直接输入string
operator<<:可以直接输出string
getline:可以输入包括空格在内的string