首页 > 编程语言 >STL标准模板库c++

STL标准模板库c++

时间:2024-11-14 15:19:08浏览次数:3  
标签:容器 迭代 STL back c++ 插入 vector push 模板

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)

标签:容器,迭代,STL,back,c++,插入,vector,push,模板
From: https://blog.csdn.net/2302_80554221/article/details/143770252

相关文章

  • 单向链表题库2(c++)
    目录前言[1.力扣——LCR123.图书整理I](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/description/)[2.力扣——LCR024.反转链表](https://leetcode.cn/problems/UHnkqh/submissions/580256040/)[3.力扣LCR141.训练计划III](https://le......
  • c++ 标准 智能指针 与 qt 智能指针 对比
    C++标准库提供了std::unique_ptr和std::shared_ptr等智能指针,而Qt则提供了QScopedPointer、QSharedPointer和QWeakPointer等自己的智能指针。两者在设计上有一些相似之处,但也存在一些关键的差异。下面是C++标准智能指针和Qt智能指针的详细对比:1.std::uniq......
  • C++生成随机数
    目录一、传统方式:std::rand 和 std::srand使用方法:优缺点:二、现代方式: 库(推荐)1. 随机整数2. 随机浮点数3. 布尔值4. 字符5. 正态分布(高斯分布)6. 离散分布的随机数7. 随机字符串8. UUID(通用唯一标识符)三、std::shuffle:用于打乱序列四、总结:选择合适的......
  • 【华为OD机试真题E卷】573、区间交叠问题 | 机试真题+思路参考+代码解析(E卷复用)(C++、J
    文章目录一、题目......
  • Linux-vscode-c++-slambook2-库文件找不到路径
    Linux-vscode-c++-slambook2-库文件找不到路径分享所遇到的困难,填补这些坑洞,希望后来者能够如履平地。首先已经在c_cpp_properties.json中已经添加了相关的文件,"includePath":["${workspaceFolder}/**","/usr/include/eigen3"......
  • 原生鸿蒙政务行业应用开发模板上线,近200个政务服务应用已上架
    一直以来,发展新质生产力对数字政府建设意义重大。华为原生鸿蒙之夜暨华为全场景新品发布会上,华为宣布从底座上全面突破操作系统的核心技术,实现了操作系统的自主可控。截至发布会,鸿蒙原生应用和元服务上架数已突破1.5万个,已有180余个政务服务一网通办平台、公积金类、医保服务类和......
  • 三步解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “M
    文章目录前言一、问题描述二、报错信息三、解决步骤1.下载并安装MicrosoftVisualC++BuildTools2.配置系统环境变量3.重新运行安装指令四、安装成功总结前言本文记录了在使用AnacondaPrompt安装Python程序包时遇到的报错问题,并详细描述了如何通过安装Micros......
  • c++类循环依赖的问题
    目前的一种状况是A类中以B类指针作为成员变量,B类在构造时需传入A类指针作为参数。a.hclassA{ B*b;};b.hclassB{ B(A*a);};这种情况需要在头文件中前向声明,然后在.cpp文件中include另一个类的头文件。如下:a.hclassB;classA{ B*b;};b.hclassA;classB{ B......
  • C++中的方法宏定义
    #defineCORE_INIT(fn)__define_core_initcall(fn)这一行代码是一个宏定义,用于将fn传递给__define_core_initcall宏或函数。具体解释如下:#define:定义一个宏,用于将宏名替换为对应的代码片段。CORE_INIT(fn):这是宏的名称和参数。CORE_INIT是宏名,fn是参数,表示函数或代......
  • C++基础语法实现写时复制CowString
    前言: CowString写时复制设计思路难点:通过下标访问字符串元素的基本思路重载[]运算符,在函数中直接返回该位置指针的解引用,但此时返回值为char类型,对于进行单个字符串修改的操作,如:str[1]='H';,无法处理赋值时的写时复制操作,只能通过输出流运算符输出char。解决方法:可以在Cow......