一个很草的笔记,函数太多了学一遍根本记不住,放上来方便复习和随时查找,有空慢慢更。
STL学习笔记目录
一、string容器
1.string
2.string的迭代器(待更新)
二、vector容器(待更新).
三、list容器(待更新).
四、deque双端队列(待更新).
五、map(待更新).
六、set(待更新).
string容器
- 简单了解STL
- 一、string容器
- 1.头文件 string
- 2.构造函数
- (1)无参构造 string()
- (2)string(size_type length , char ch)
- (3)字符串初始化
- (4)截取str的前n个
- (5)截取str中间几个
- (6)拷贝构造 string(const string &str)
- 3.属性
- (1)容量:可以容纳的字符数量
- (2)求字符串长度 length()
- (3)求字符个数 size()
- (4)重新设置字符个数,容量不变 resize()
- 4.string的输出
- (1)输出全部: << 以及 c_str()
- (2)输出单个字符: []下标运算,at()
- 5.string的修改
- (1)修改指定元素:at函数
- (2)中间插入 insert
- (3)末尾插入字符或字符串 append
- 6.string复制比较:操作函数
简单了解STL
STL包含以下六个部分:
容器、迭代器、算法
适配器、分配器、仿函数
1.容器
是系统帮我们封装好的数据结构(数组、链表、栈、队列、树、hash表)
每种容器都能装任意类型
主要是数据结构的操作
2.算法
系统帮我们写好的算法(排序、交换、替换等等)
一个算法可以适用多个容器
3.迭代器
可以理解为是链接容器和算法的连接器
一、string容器
专门的字符串操作的一个类
字符串CString 、QString
跟 char*的区别:
char* 是指向字符数组首地址的指针,string.h 中声明了很多字符串操作,例如strlen strcat strcmp strcpy
string则是一个类,这个类将以上这些内容封装到一起,使字符串操作更加灵活
使用string时不用考虑内存分配释放,不用担心越界崩溃
1.头文件 string
2.构造函数
(1)无参构造 string()
直接输出,empty() 判断字符串是否为空,空返回true(1),非空返回false(0)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str; //无参构造,没有输出
cout << str << str.empty() << endl; //在string的封装中进行了运算符重载,可以直接输出对象 str1.empty()返回1
return 0;
}
(2)string(size_type length , char ch)
参数1:字符数
参数2:传入字符
string str1(5,'a');
cout << str1 << endl; //aaaaa
(3)字符串初始化
string(const char* str)
string str2("abcdefg");
cout << str2 << endl; //输出abcdefg
(4)截取str的前n个
string(const shar* str , size_type length)
string str("abcdefg",3);
cout << str << endl; //abc
(5)截取str中间几个
string (string &str , size_type index , size_type length)
参数一:截取对象
参数二:开始下标
参数三:截取字符数
string str("abcdefg");
string str1(str,2,5);
cout << str1 << endl; //cdefg
(6)拷贝构造 string(const string &str)
string str("abcdefg");
//用一个对象给另一个对象初始化时,调用拷贝构造
string str1(str);
cout << str1 << endl; //abcdefg
3.属性
(1)容量:可以容纳的字符数量
空字符串(无参str)的容量:少于15个字符时,默认为15个
原因是假如有一个大小为5的字符数组,那添加第六个字符时,不会直接在末尾添加,而是需要重新申请大小为6的空间,将前五个字符复制过来,再加入第六个字符,这样代码的效率是非常低下的,所以系统设定空字符串的容量是15
string str;
cout << str.capacity() << endl; //15
不同编译器下容量不同,越界时,不同编译器下增加的容量也不同,例如:
vs2005:超过15个,每超1个增加16个,超过n个增加15+ n*16个。例如16个时,容量为31个,即字符数16,容量15+16=31,字符数32,容量31+16=47(15+16+16),字符数48,容量47+16=63(15+16+16+16)
vc6.0:至少申请31个空间,以后每次增加32个
QT:至少申请15个空间,以后每次增加1个
void strpro() //QT
{
string str1(16,'a');
cout << str1.capacity() << endl; //16
}
修改容量函数: reserve();
不能变小,只能变大
vs2005:小于等于15个,即str1.reserve(15); 容量依旧是15;大于15个,即str1.reserve(16); 容量31 ;str1.reserve(32); 容量47 。规律和capacity()一样
QT:待测试
void strpro() //vs2005
{
string str1(5,'a');
str1.reserve(16);
cout << str1.capacity() << endl; //30
}
(2)求字符串长度 length()
void strpro()
{
string str;
cout << str.length() << endl; //0
string str1(5,'a');
str1.reserve(16);
cout << str1.length() << endl; //5
string str2("abcdefg");
cout << str2.length() << endl; //7
string str3("abcdefg",3);
cout << str3.length() << endl; //3
string str4(str2,2,3);
cout << str4.length() << endl; //3
string str5(str2);
cout << str5.length() << endl; //7
}
(3)求字符个数 size()
void strpro()
{
string str;
cout << str.size() << endl; //0
string str1(5,'a');
str1.reserve(16);
cout << str1.size() << endl; //5
string str2("abcdefg");
cout << str2.size() << endl; //7
string str3("abcdefg",3);
cout << str3.size() << endl; //3
string str4(str2,2,3);
cout << str4.size() << endl; //3
string str5(str2);
cout << str5.size() << endl; //7
}
(4)重新设置字符个数,容量不变 resize()
void strpro()
{
string str2("abcdefg");
str2.resize(3);
cout << str2 << endl; //abc
cout << str2.size() << endl; //3
cout << str2.length() << endl; //3
cout << str2.capacity() << endl; //15
}
4.string的输出
(1)输出全部: << 以及 c_str()
void strcout()
{
string str2("abcdefg");
cout << str2 << endl; //重载运算符
//相当于在一个类中有一个char* p
//当传入abcdefg时,系统会申请一块空间(p = new[15]),将abcdefg放入
//p是字符串首地址,c_str的作用是 return p
cout << str2.c_str() << endl;
}
(2)输出单个字符: []下标运算,at()
void strcout()
{
string str2("abcdefg");
cout << str2[0] << endl; //重载下标运算符,越界会崩溃
cout << str2.at(0) << endl; //越界会出现异常 out_of_range
//越界处理
try
{
str2.at(8);
}
//catch(...)
catch(out_of_range &a)
{
cout << "崩溃了" << endl;
}
}
5.string的修改
(1)修改指定元素:at函数
string str("abcdefg");
str[2] = 's';
str.at(3) = 'q';
(2)中间插入 insert
index位置插入str
basic_string &insert(size_type index,const basic_string &str);
index位置插入一个字符串
basic_string &insert(size_type index,const char* str);
index1位置插入另一个对象的某一段
basic_string &insert(size_type index1,const basic_string &str,size_type index2,size_type num);
插入前几个
basic_string &insert(size_type index,const char* str,size_type num);
插入num个ch
basic_string &insert(size_type index,size_type num,char ch);
void strchange()
{
string str("abc");
string str1("xyz");
str.insert(1,str1);
cout << str << endl; //axyzbc
}
(3)末尾插入字符或字符串 append
+= 拼接:拼接对象、拼接字符串
尾巴通过一个对象拼接
basic_string &append(const basic_string &str);
尾巴通过一个字符串拼接
basic_string &append(const char *str);
拼接一个子对象的某一段
basic_string &append(const basic_string &str,size_type index,size_type len);
拼接字符串前几个
basic_string &append(const char* str,size_type num);
拼接num个字符ch
basic_string &append(size_type num,char ch);
void strchange()
{
string str("abc");
string str1("xyz");
str.append(str1);
cout << str << endl; //abcxyz
}
6.string复制比较:操作函数
(1)比较
a < b ,返回-1
a == b ,返回0
a > b ,返回1
比较两个对象
int compare(const basic_string &str);
void strcom()
{
string str("abcdefg");
string str1("abd");
/*
原理:遍历字符串
a与a比较,b与b比较,相同继续往后比,
c与d比较,c<d ,比较结束,abd > abcdefg,即str1 > str
如果是abcdefg和abc,a与a比较,b与b比较,c与c比较
c后面没有了,比较结束,abcdefg > abc,即str > str1
*/
//重载比较运算符,结果是真 1 假 0 (bool类型)
cout << (str > str1) << endl; //0
//a < b 返回-1 ,a == b 返回0 ,a > b 返回1 (int类型)
cout << str.compare(str1) << endl; //-1
}
比较一个对象和字符串
int compare(const char* str);
本对象的一段,跟参数3 的对象比较
int compare(size_type index,size_type length,const basic_string &str);
两个字符
int compare(size_type index,size_type length,const basic_string &str,size_type index2,size_type length2);
void strcom()
{
string str("abcdefg");
string str1("abd");
//a < b 返回-1 ,a == b 返回0 ,a > b 返回1 (int类型)
//bcd 与 abd 比较,b > a
cout << str.compare(1,3,str1) << endl; //1
//bcd 与 bd 比较,c < d
cout << str.compare(1,3,str1,1,2) << endl; //-1
}
(2)复制
将对象中的某一段复制进一个字符数组中
size_type copy(char* str,size_type num,size_type index);
参数1:数组
参数2:复制的字符数量
参数3:开始复制的下标
void strcopy()
{
string str("abcdefg");
char a[6] = {0};
str.copy(a,2,3); //注意不要越界
cout << a << endl; //de
}
(3)查找子串
从指定位置开始查找str,找到就返回起始位置
size_type find (const basic_string& str, size_type index);
指定位置查找一个字符串
size_type find (const char* str, size_type index);
指定段查找str
size_type find (const char* str, size_type index,size_type length);
指定位置开始查找字符
size_type find (char sh, size_type index);
void strfun()
{
string str("abcdefg");
string str1("abr");
string str3("bc");
cout << str.find(str3,0) << endl; //找到返回下标
cout << (int)str.find(str1,0) << endl; //没找到返回-1的补码,强转int即-1
cout << (int)str.find("def",0) << endl;
cout << (int)str.find('e',0) << endl;
}
(4)返回子串
返回指定位置的子串
substr(size_type index,size_type num = npos);
string str("abcdefg");
cout << str.substr(2,4) << endl; //cdef
(5)交换
交换两个对象的内容
swap(basic_string &str);
string str("abcdefg");
string str1("hello");
str.swap(str1);
cout << str << endl;
cout << str1 << endl;
7.运算符重载
string str("abcdefg");
string str1("hello");
//可以加对象,也可以加字符串
cout << str+str1 << endl;