C++_string容器、vector容器、deque容器_学习笔记

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());//默认升序排序
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值