目录
1. 什么是STL
2. STL的版本
3. STL的六大组件
4. STL的缺陷
5. 引出string类
6. 标准库中的string类
6.1 string类简介
6.2 string类对象的构造
void Teststring()
{
string s1; //构造空的string类对象s1
string s2("hello word"); //用字符串构造string类对象s2
string s3(s2); //拷贝构造s3
string s4(s2,5,3); //拷贝构造s2,从第5个位置开始(从0开始)取3个字符
string s5(s2,5,10); //拷贝构造s2,从第5个位置开始,取10个字符,不够,有多少取多少
string s6(s2,5); //拷贝构造s2,从第5个位置开始,取余下的
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
cout << s5 << endl;
cout << s6 << endl;
}
int main()
{
Teststring();
return 0;
}
6.3. string类对象的容量
void Teststring2()
{
string s1("hello word");
for(size_t i=0;i<s1.size();i++)
{
cout << s1[i] << " "; //这里的[]实际是调用的运算符重载
cout << s1.operator[](i) << " "; //[]运算符重载
}
cout << endl;
cout << s1.size() << endl;
cout << s1.capacity() << endl;
}
int main()
{
Teststring2();
return 0;
}
查看扩容机制:
void Teststring2()
{
string s1("hello word");
for(size_t i=0;i<s1.size();i++)
{
cout << s1[i] << " "; //这里的[]实际是调用的运算符重载
cout << s1.operator[](i) << " "; //[]运算符重载
}
cout << endl;
cout << s1.size() << endl;
cout << s1.capacity() << endl;
}
6.4. string类对象的遍历
用迭代器遍历
void Teststring3()
{
string s1("hello word");
const string s2("hello word");
string::iterator it1 = s1.begin(); //begin为开始位置
while(it1 != s1.end()) //end为最后的下一个位置
{
cout << *it1 << " ";
++it1;
}
string::const_iterator it2 = s2.begin(); //const迭代器,只读,不可以修改
while(it1 != s2.end())
{
cout << *it2 << " ";
++it2;
}
}
void Teststring4()
{
string s1("hello word");
string::reverse_iterator rit = s1.rbegin(); //反向迭代器
while(rit != s1.rend())
{
cout << *rit << " ";
++rit;
}
}
6.5. string类对象的修改
void Teststring4()
{
string s1("hello word");
s1.push_back('!');
cout << s1 << endl;
s1.append("hello bit");
cout << s1 << endl;
s1.append(10,'x');
cout << s1 << endl;
}
6.6. string类非成员函数
6.7. vs和g++下string结构的说明
注意:下述结构是在32位平台下进行验证, 32位平台下指针占4个字节。
union _Bxty
{ // storage for small buffer or pointer to larger one
value_type _Buf[_BUF_SIZE];
pointer _Ptr;
char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;
◆ 这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。
◆ 其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量
◆ 最后:还有一个指针做一些其他事情。
◆ 故总共占16+4+4+4=28个字节。
struct _Rep_base
{
size_type _M_length;
size_type _M_capacity;
_Atomic_word _M_refcount;
};
本章完。