小强在学习的路上

小强在学习的路上

目录

1. 什么是STL

2. STL的版本 

3. STL的六大组件

4. STL的缺陷

5. 引出string类

6. 标准库中的string类

6.1 string类简介

6.2 string类对象的构造

6.3. string类对象的容量

6.4. string类对象的遍历

6.5. string类对象的修改

6.6. string类非成员函数

6.7. vs和g++下string结构的说明


1. 什么是STL

2. STL的版本 

3. STL的六大组件

【C++】STL简介 | STL六大组件 | string类 | string类对象操作-LMLPHP

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;
}

【C++】STL简介 | STL六大组件 | string类 | string类对象操作-LMLPHP

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;
}

【C++】STL简介 | STL六大组件 | string类 | string类对象操作-LMLPHP

 

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;
 
}

【C++】STL简介 | STL六大组件 | string类 | string类对象操作-LMLPHP

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;

◆ 这种设计也是有一定道理的大多数情况下字符串的长度都小于16string对象创建好之后部已经有了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;
};   

本章完。

03-02 08:22