1 string容器
1.1 基本概念
string本质是一个类,内部封装了char*,是一个char*类型的容器
1.2 构造函数
string(); // 创建空字符串 例如string str;
string(const char* s); // 使用C语言字符串char*s构造
string(const string& str); // 拷贝构造
string(int n, char c);//使用n各字符c初始化
1.3 赋值
原型函数:
string& operator=(const char* s); // 把char*类型字符串赋值给当前字符串
string& operator=(const string &s); // 把字符串s赋值给当前字符串
string& operator=(char c); // 赋值单个字符
string& assign(const char* s); // 跟上面前两个一样
string& assign(const string &s);
string& assign(const char *s, int n); // 把前n个字符赋给当前字符串
string& assign(int n, char c); // 把n个字符c赋值给当前字符串
用法:
string str;
str = "Hello";
str.assign("Hello"); // str = "Hello"
str.assign("Hello", 3); // str = "Hel"
1.4 拼接
原型函数:
直接用+=拼接,原型函数懒得写
string& append(const char* s);
string& append(const string &s);
string& append(const char *s, int n);
string& append(const string &s, int pos, int n); // 字符串s从pos开始的n个字符连接到字符串结尾
string str1 = "Hello";
string str2 = "World";
str1 += ' '; // str1 = "Hello "
str1 += str2; // str1 = "Hello World"
str1.append(".Hi "); // str1 = "Hello World .Hi "
str1.append("Nanjing Normal University", 6); // str1 = "Hello World .Hi Nanjing"
1.5 查找和替换
原型函数懒得写了
string str1 = "abcdefg";
//从左往右查找
str1.find("de"); //返回一个int,位置下标3。如果找不到为-1。
//从右往左查找
str1.rfind("de"); //返回一个int,位置下标3。如果找不到为-1。
//从位置1起,将3个字符替换
str1.replace(1,3,"12345"); // str1 = "a12345efg
1.6 字符串比较
按照ASCII进行对比
返回值:等于 0;小于 -1;大于1
逐位对比,当对比到不一样时返回1或-1,完全一样则返回0
一般用来判断是否相等
str1.compare(str2);
另外
str1.size();
str1.length();
分别可以返回字符串大小和长度
1.7 字符存取
str1[i];
str.at(i)
这两个效果一样,返回下标i的字符
1.8 字符串插入和删除
string str1 = "Hello";
//在下标i插入字符串
str1.insert(1, "123");// str1 = "H123ello"
//在下标1删除3个
str1.erase(1,3);// str1 = "Hello"
1.9 子串获取
string str1 = "Hello";
//从位置1起截3个
string substr = str.substr(1,3);//substr = "ell"
配合.find()函数可以截取想要的子串
2 vector容器
和数组非常相似,也被称为单端数组。
数组是静态空间,到哪vector可以动态扩展。
动态扩展:不是在原空间后续新空间,而是找更大的内存空间,然后将元数据拷贝到新空间,释放原空间。
vector的迭代器是支持随机访问的迭代器,
2.1 构造
注意用迭代器的地方一定要用迭代器
// 1.默认构造 无参构造
vector<int> v1;
v1.push_back(10); // 往vector压数字
//2.通过区间方式构造 左闭右开
vector<int>v2(v1.begin(), v1.end());//将v1某区间内的所有元素放入v2
//3.n个elem方式构造
vector<int>v3(10, 100); // 放10个100进去
//4.拷贝构造
vector<int>v4(v3);
2.2 赋值
//1.等号重载 operator=
v2 = v1;
//2.assign区间
v3.assign(v1.begin(), v1.end()); //左闭右开区间内元素
//3.n个elem
v4.assign(10, 100); // 放10个100
2.3 容量和大小
vector<int>v1;
v1.empty();//判断是否为空,返回bool
v1.capacity();//返回容量
v1.size();//返回元素个数
v1.resize(int num);//重新指定大小,如果变大,用0填充
v1.resize(int num, elem);//重新指定大小,如果变大,用elem填充
2.4 插入和删除
v1.push_back(10); // 尾插法插入数字10
v1.pop_back(); // 尾删法删除最后一个元素
v1.insert(v1.begin(), 100);//在指定迭代器插入元素
v1.insert(v1.begin(), 2, 100);//在指定迭代器插入两个100
v1.erase(v1.begin());//删除指定迭代器元素
v1.erase(v1.begin(), v1.end());//删除指定区间元素 左闭右开
//上述迭代器参数都可以加偏移量
v1.erase(v1.begin()+3);
2.5数据存取
//这两个效果一样,返回下标i的字符
v1[i];
v1.at(i);
v1.front(); // 返回第一个元素
v1.back(); // 返回最后一个元素
2.6 互换容器
把两个容器元素互换
v1.swap(v2);
收缩内存的用法:
如果有一个size很小但capacity很大的容器v,可以通过创建匿名容器并交换的方法来将其capacity收缩为size同样大小。
vector<int>(v).swap(v);
2.7 预留空间
可以减少vector在动态扩展容量时的扩展次数.
因为如果有多次的写入操作,vector的空间会被反复请求释放,如果一开始就知道要用多少的空间,就可以避免这样的动作。
//容器预留len个元素长度,但预留位置不初始化,元素不可访问。
v1.reserve(1000);
3 deque容器
双端数组,可以对两端进行插入和删除
与vector区别:
vector访问元素的速度更快
deque对头部的插入删除效率更高
deque内部有个中空气,维护缓冲区内容,使得deque像一片连续的内存空间。而vector是连续的内存空间,因此vector访问元素时更快。
3.1 构造函数
deque<int>d1;
for(int i=0;i<10;i++)
{
d1.push_back(1);
}
deque<int>d2(d1.begin(), d1.end());
deque<int>d3(10, 100);
deque<int>d4(d3);
3.2 赋值操作
和vector基本一样。
//1.等号重载 operator=
d2 = d1;
//2.assign区间
d3.assign(d1.begin(), d1.end()); //左闭右开区间内元素
//3.n个elem
d4.assign(10, 100); // 放10个100
3.3 大小操作
d1.empty();//判断是否为空,返回bool
d1.size();//返回元素个数
d1.resize(int num);//重新指定大小,如果变大,用0填充
d1.resize(int num, elem);//重新指定大小,如果变大,用elem填充
deque没有容量
3.4 插入和删除
d1.puch_back(elem);//尾插
d1.push_front(elem);//头插
d1.pop_back();//尾删
d1.pop_front();//头删
deque<int>::iterator it = d1.begin();
d1.insert(it+i, elem);//在指定位置插入
d1.insert(it+i, int num, elem);
//在指定位置插入区间内元素
d1.insert(it+i, d2.begin(), d2.end());
d1.erase(it + i);
d1.erase(it+i, d2.begin(), d2.end());
d1.clear();//清空
3.5 数据存取
//这两个效果一样,返回下标i的字符
d1[i];
d1.at(i);
d1.front(); // 返回第一个元素
d1.back(); // 返回最后一个元素
3.6 排序操作
支持随机访问的迭代器的容器都可以sort。
#include<algorithm>
sort(d1.begin(), d1.end());//默认升序排序