目录

vector容器

vector的构造函数

vector的赋值操作

vecotor的容量

vector的插入和删除

vector数据存取

vector的互换容器

vector预留空间

容器嵌套容器

String 容器

string的赋值操作

string字符串拼接

字符串的查找和替换

字符串中字串的查找:

字符串中字串的替换:

string中字符串的比较

string字符存取

string的插入和删除

字串的获取

deque容器

deque的构造函数

deque容器的赋值操作

deque容器的大小操作

deque容器的插入和删除

 deque容器的数据读取

 deque排序

stack容器

queue容器(队列)

list容器链表

构造函数

赋值和交换

大小操作:

list插入和删除

数据存取

list反转和排序

Set/multiset容器

set大小和交换

set插入和删除

set查找和统计

pair对组的创建

Set容器的排序

map容器

map构造与赋值

Map大小和交换

Map插入和删除

Map查找和统计

Map容器排序


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的赋值操作

  1. 直接赋值 v2=v1;
  2. assign方式赋值;v3.assign(v1.begin(),v1.end());//通过区间来赋值
  3. n个elem;v4.assign(10,100)//赋值10个100;

vecotor的容量

  1. 容量>=大小
  2. resize后若没有设置数则多余位置用0填充;重载版本可以指定填充的数字
  3. 若resize后的容量过小,则删除多余的元素;resize不改变其容量但改变其大小

vector的插入和删除

  1. 尾插法  v1.push_back(10);会重新分配一块内存存取数据,原来的迭代器失效。
  2.  尾删法 v1.pop_back();
  3. 迭代器指向位置前插入元素  v1.insert(v.begin(),1);
  4. 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数据存取

  1. 可以利用[]方式访问具体的元素例如  v[1];
  2.  利用成员函数访问v1.at(1);
  3. 获取第一个元素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的赋值操作

  1. 利用等号直接赋值;
  2. 利用已有字符串赋值给空字符串变量;
  3. 利用assign赋值,调用成员函数;str.assign("字符串")
  4. 赋值字串,str.assign("hello",3);将hel赋值给str;

string字符串拼接

  1. 利用+=来实现追加;string str = "字符串";str+="字符串";字符也是一样;对于字符串变量也一样;
  2. 通过append的方式实现追加;直接调用成员函数str.append("字符串");也可以实现只追加前n的字符;str.append("字符串",n);
  3. 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)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐