STL :广义上分为:容器,算法,迭代器容器与算法间通过迭代器进行无缝连接。
STL六大组件,分别是容器,算法,迭代器,仿函数,适配器,空间配置器。
vector容器
可以理解为数组;为单端数组,区别在于数组为静态空间,而vector可以动态扩展
动态扩展:
不是在原空间下,找到更大的空间,然后将原数据拷贝到新空间,释放原空间
vector的迭代器支持随机访问
vector的构造函数
vector<int > v;//默认构造
Vector <int> v2 (v.begin(),v.end())//通过区间方式构造
Vector<int>v3(10.100)//10个100构造
vector<int>v4(v3);//拷贝构造
vector的赋值操作
- 直接赋值 v2=v1;
- assign方式赋值;v3.assign(v1.begin(),v1.end());//通过区间来赋值
- n个elem;v4.assign(10,100)//赋值10个100;
vecotor的容量
- 容量>=大小
- resize后若没有设置数则多余位置用0填充;重载版本可以指定填充的数字
- 若resize后的容量过小,则删除多余的元素;resize不改变其容量但改变其大小
vector的插入和删除
- 尾插法 v1.push_back(10);会重新分配一块内存存取数据,原来的迭代器失效。
- 尾删法 v1.pop_back();
- 迭代器指向位置前插入元素 v1.insert(v.begin(),1);
- erase删除迭代器指向的元素erase(v.begin());或者是其重载v.erasr(v.begin(),v,end());清除某个区间
在使用erase时,消除迭代器指向的元素后,后面的元素自动往前补齐,相当于迭代器向前移动了一位;
class Solution {
public:
//先通过迭代器遍历该数组 并且统计0的个数,若为0就删除该数;最后将统计的0的个数尾插到后面
void moveZeroes(vector<int>& nums) {
//1, 统计0的个数,并且删除0
int count_0=0;
for(vector<int>::iterator it=nums.begin();it!=nums.end();)
{
if(*it==0){
count_0++;
it=nums.erase(it);
}else{
it++;
}
}
//2,将0插入末尾
for(int i=0;i<count_0;i++)
{
nums.push_back(0);
}
}
};
vector数据存取
- 可以利用[]方式访问具体的元素例如 v[1];
- 利用成员函数访问v1.at(1);
- 获取第一个元素front();获取最后一个元素back();
vector的互换容器
V1.swap(v2);//实现两个容器元素互换
实际意义::
巧用swap可以收缩内存
当我将一个很大的容量 resize为很小的大小后,其多余的容量不会释放,造成浪费;
Vector<int> (v).swap(v);//vector<int>(v)相当于是拷贝构造函数 拷贝出一个v的匿名对象,该匿名对象容量和大小与v均相同,.swap(v)表示将该匿名对象与v的容器互换,这样v的容器就容器就变合适的大小了;
vector预留空间
reserve相当于是预留了一段内存;
统计开辟内存
在使用之前需要包含其头文件<vector>:
//每一个容器都有自己的迭代器,迭代器用于遍历元素
v.begin()返回迭代器 指向第一个 容器中第一个数据
v.end () 指向容器中最后一个元素的 下一个位置
Vector<int>::iterator 拿到这种容器迭代器的类型
Vector<int > v;//声明容器类型及容器名;即迭代器
v.push_back(10);
v.push_back(20);//插入数据 push_back 为其内置函数;
//通过迭代器访问容器中的数据 可以理解为指针
Vector<int >::iterator itBegin = v.begin();//起始迭代器 指向第一个元素
Vector<int >::iterator itEnd = v.end();//结束迭代器 指向最后i一个元素的下一个位置
//第一种遍历方式
While(itBegin!=itEnd)
{
Cout<<*itBegin<<endl;
itBegin++;
}
//第二种遍历方式
For(vector<int >::iterator it=v.begin();it!=v.end();it++)
{
Cout<<*it<<endl;
}
//第三种利用内置的遍历算法 需要会包含头<algorithm>
标准算法头文件
//利用stl算法
For_each(v.begin(),v,end(),myPrint);
Void myPrint(int val)
{
Cout<<val<<endl;
}
黄色区域需要自己提供一个输出函数,本质为回调技术,即将指针遍历到的每一个元素解出来在输出
容器嵌套容器
可以理解为二维数组;即vector<vector<int>> v;在一个容器中放入其他容器;通过vector<int> v1,v2,v3;声明多个小容器,并利用名字给其插入数据;
在后再将小容器插入到大容器中;
即v.push_back(v1);等;
如何遍历该容器中的所有数据,并且输出?
双重循环,外层循环遍历每一个容器,内层循环遍历每一个容器中的数据,再进行输出;在输出时要注意迭代器(指针)代表的含义,代表容器还是数据?
voidtest(){
//容器嵌套
vector<vector<int>>v;
vector<int>v1;
vector<int>v2;
vector<int>v3;
vector<int>v4;
//给每个小容器插入数据
for(inti=0;i<4;i++)
{
v1.push_back(i);
v2.push_back(i+1);
v3.push_back(i+2);
v4.push_back(i+3);
}
//将每个小容器插入大容器中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
//遍历输出容器中的元素
//外层循环遍历每个容器
for(vector<vector<int>>::iteratort=v.begin();t<v.end();t++)
{
//内层循环遍历容器中每个元素
for(vector<int>::iteratorvt=t->begin();vt<t->end();vt++)
{
cout<<*vt<<"";
}
cout<<endl;
}
}
String 容器
string的构造函数:
Const char *str="hello world";
String s1(str);
String s2(s1);//拷贝构造;
String(5,a);//5个a;
string的赋值操作
- 利用等号直接赋值;
- 利用已有字符串赋值给空字符串变量;
- 利用assign赋值,调用成员函数;str.assign("字符串")
- 赋值字串,str.assign("hello",3);将hel赋值给str;
string字符串拼接
- 利用+=来实现追加;string str = "字符串";str+="字符串";字符也是一样;对于字符串变量也一样;
- 通过append的方式实现追加;直接调用成员函数str.append("字符串");也可以实现只追加前n的字符;str.append("字符串",n);
- append还能实现控制所追加字符的位置和个数;即str.append(str1,3,3);//str1字符的从0开始数 的第三个字符到后三个字符追加到str中;可控制位置和长度
字符串的查找和替换
字符串中字串的查找:
1.利用内置函数find(所查找子串);若查找到返回其下标,若未找到返回-1;
2.rfind为从右往左查找,find为从左往右查找;
字符串中字串的替换:
1.调用内置函数replace(起初位置,长度,替换字符串)从起初位置到长度后的字符串替换为替换的字符串
string中字符串的比较
调用内置函数compare.
string字符存取
通过下标访问每个字符即str[i],size获取字符长度;for循环遍历每一个字符并且输出;i<str.size()或者通过at来访问,即str.at(i);i要遍历该字符串;
修改单个字符通过下标修改,或者at();的方式
string的插入和删除
字符床的插入:
1.通过insert(插入的位置,插入的字符串)的方式,在1号位后插入字符串
字符串的删除:
1.通过erase(删除的位置,删除的长度)删除的长度为删除的位置开始计算的
字串的获取
获取字串并且返回该字串 从pos位置开始到经过的长度,截取为一个字串并返回;
deque容器
deque的构造函数
deque容器的赋值操作
与vector容器的赋值方式一样
deque容器的大小操作
deque容器的插入和删除
对两端的插入和删除;
对中间指定位置数据的插入和删除;
deque容器的数据读取
deque排序
利用sort函数对deque进行排序;
需要包含头文件#include<algorithm>
Deque<int> d;
Sort(d.begin(),d.end());
stack容器
只有栈顶可以被外界使用,不允许遍历行为
queue容器(队列)
先进先出的数据结构,他有两个出口
list容器链表
占用空间大,遍历速度慢,可以对任意位置进行插入或删除
构造函数
赋值和交换
大小操作:
list插入和删除
数据存取
list反转和排序
不可以使用标准算法,内部会提供函数
sort中需要添加一个排序规则函数,返回值为bool
Set/multiset容器
Insert//插入数据
set大小和交换
set插入和删除
set查找和统计
pair对组的创建
Set容器的排序
内置数据类型:
再插入数据之前,对容器的排序进行改变,利用类名重载小括号形成仿函数;
Class mycompare
{
Public:
//重载();降序输出
Bool operator()(int v1,int v2){
Return v1>v2;
}
};
Set<int , mycompare>s1;
自定义数据类型:
利用仿函数指定排序规则;
Class mycompare
{
Public:
//重载();降序输出
Bool operator()(person&p1,person &p2){
Return p1.age>p2.age;//按照年龄降序
}
};
Set<int , mycompare>s1;
map容器
map构造与赋值
利用first和second去访问pair中的元素,例如:
map<int ,int>m;m.first=1;m.second=2;
或者m.insert(pair<int,int>(1,10));
Map大小和交换
Map插入和删除
1,m.insert(make_pair(1,10));
2,m.insert(pair<int,int>(1,10));
3,m.insert(map<int.int>::value_type(3,30));
4,m[4]=40;//通过下标来赋值 如果再输出中调用不存在的key值,即m[5]编译器会自动创建出key值,且给其赋值0;因此不建议插入,可以用于访问该key对应的值
Map查找和统计
count只能是1或0;对于重复的key值,map容器只能存在一个key,不重复
Map容器排序
针对key值来进行排序
Hush_map(unordered_map)
标签:容器,迭代,STL,back,c++,插入,vector,push,模板 From: https://blog.csdn.net/2302_80554221/article/details/143770252