STL学习

STL

  • 泛化编程template
    • 函数模板
    • 类模板
  • iterator迭代器
  • C++ array(STL array)容器

STL中文名为标准库,是C++标准的规定并且提供了自己编写STL的接口,在编译器实现中统一的分成立几个容器头文件和几个其他的头文件来完成数据结构和算法的抽象,现在编译器使用的是microsoft版本的,这种处理还泛化了接口。

泛化编程template

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

函数模板

template <typename type> ret-type func-name(parameter list)
{// 函数的主体
}

在这里插入图片描述

类模板

template <class type> class class-name {
.
.
.
}
#include<iostream>
#include<vector>
using namespace std;template<class T>class Stack{
private:vector<T>elems;
public:void push(const T&);void pop();T top() const;bool empty() const{return elems.empty();}
};template<class T>void Stack<T>::push(T const&elem){elems.push_back(elem);
}
template<class T>void Stack<T>::pop(){if(elems.empty()){throw out_of_range("hahaha empty stack");}elems.pop_back();
}
template<class T>T Stack<T>::top()const
{if(elems.empty()){throw out_of_range("haha2233 empty stack");}return elems.back();
}
int main(){try{Stack<int> intStack;Stack<string>stringStack;intStack.push(7);cout<<intStack.top()<<endl;stringStack.push("666a");cout<<stringStack.top()<<std::endl;stringStack.pop();cout<<stringStack.top()<<std::endl;stringStack.pop();}catch(exception const&ex){cerr<<"exception"<<ex.what()<<endl;return -1;}
}

在这里插入图片描述

iterator迭代器

迭代器按照定义方式分成以下四种。

  1. 正向迭代器,定义方法如下:
    容器类名::iterator 迭代器名;

  2. 常量正向迭代器,定义方法如下:
    容器类名::const_iterator 迭代器名;

  3. 反向迭代器,定义方法如下:
    容器类名::reverse_iterator 迭代器名;

  4. 常量反向迭代器,定义方法如下:
    容器类名::const_reverse_iterator 迭代器名;

#include<iostream>
#include<vector>
using namespace std;
int main(){vector<int>v;for(int i=0;i<70;i++){v.push_back(i);}vector<int>::iterator j;for(j=v.begin();j<v.end();j++){cout<<*j<<' ';*j*=3;}for(vector<int>::reverse_iterator r=v.rbegin();r<v.rend();++r){cout<<*r<<' ';}return 0;
}

在这里插入图片描述
迭代器按照功能分类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CDemo CDemo::operator++ ()
{  //前置++++n;return *this;
}
CDemo CDemo::operator ++(int k)
{  //后置++CDemo tmp(*this);  //记录修改前的对象n++;return tmp;  //返回修改前的对象
}
#include<iostream>
#include<vector>
using namespace std;
int main(){vector<int> v(100);for(int i=0;i<v.size();i++){cout<<v[i];}vector<int>::iterator i;for(i=v.begin();i<v.end();++i){cout<<*i;}for(i=v.begin();i!=v.end();++i){cout<<*i;}i=v.begin();while(i!=v.end()){cout<<*i;i+=2;}return 0;
}

在这里插入图片描述
迭代器的辅助函数

#include<list>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){int a[5]={1,2,3,4,5};list<int>lst(a,a+5);list<int>::iterator p=lst.begin();advance(p,3);cout<<"1往前移动3个单位是4:"<<*p<<endl;advance(p,-1);cout<<"往后挪动1个单位是3:"<<*p<<endl;list<int>::iterator q=lst.end();--q;cout<<"最后一个"<<*q<<endl;cout<<"3->5=2:"<<distance(p,q)<<endl;iter_swap(q,p);//交换3,5;for(p=lst.begin();p!=lst.end();++p){cout<<*p<<" ";}return 0;
}

在这里插入图片描述

C++ array(STL array)容器

文件源码
自己写的粗略array容器

#include<iostream>
#include<iterator>
namespace std{template <typename T, size_t N>class arry{private:T elems[N];public:f1(){};f2(){};bianli()const{//;;;}cunchu(const T&){}};
}
using namespace std;
int main(){std::arry<double, 10> values;}
#include<iostream>
#include<array>
using namespace std;
int main(){array<int,4>values{};for(int i=0;i<values.size();i++){values.at(i)=2*i;}cout<<get<3>(values)<<endl;//不用迭代器if(!values.empty()){for(auto val=values.begin();val<values.end();val++){cout<<*val<<" ";}}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/52426.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07_Vue生命周期

Vue3生命周期 配置项的方式写Vue3生命周期 组合式API的方式写生命周期&#xff1a;写在setup里 如果同时用两种方式写生命周期钩子函数&#xff0c;组合式API里边的生命周期要比用配置项写的快一点。 注意&#xff1a;一般用一种方式即可。

【2023.8】docker一键部署wvp-GB28181-pro和ZLMediaKit过程全记录

安装docker 使用的操作系统是ubuntu20.04 如何在 Ubuntu 20.04 上安装和使用 Docker https://developer.aliyun.com/article/762674 docker拉取配置好的ZLMediaKIt和wvp-GB28181-pro docker pull 648540858/wvp_pro第一次运行 docker一键运行ZLMediaKIt和wvp-GB28181-pro …

机器学习深度学习——池化层

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——卷积的多输入多输出通道 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们…

HTML5(H5)的前生今世

目录 概述HTML5与其他HTML的区别CSS3与其他CSS版本的区别总结 概述 HTML5是一种用于构建和呈现网页的最新标准。它是HTML&#xff08;超文本标记语言&#xff09;的第五个版本&#xff0c;于2014年由万维网联盟&#xff08;W3C&#xff09;正式推出。HTML5的前身可以追溯到互联…

Stable Diffusion教程(6) - 扩展安装

打开stable diffusion webUI界面 加载插件列表 依次点击扩展->可用->加载自 搜索插件 首先在搜索框输入你要安装的插件&#xff0c;然后点击插件后面的安装按钮 如果你需要的插件这里面没有找到&#xff0c;可通过通网址安装的方式安装。 在git仓库网址输入框输入的你插件…

多平台打包快捷方式

一个项目会有好几个环境&#xff0c;不同环境用的时候总是需要改配置&#xff0c;比较麻烦&#xff0c;这次给大家讲一个简单的方法&#xff0c;关于Springboot项目在不同平台下的快捷打包方式。需要配合maven。 在pom文件中加入如下配置&#xff1a; <profiles><pr…

blender基础认识(选项开关、工具栏、视图等)

文章目录 引言一、大纲选项开关和保存启动文件1. 大纲选项1. 禁用选中2. 视图影藏3. 视图禁用4. 渲染禁用 2. 保存启动文件 二、工具栏和侧边栏1. 左侧工具栏2. 右侧工具栏 三、视图1. 视角2. 缩放3. 拖拽4. 摄像机视角5. 切换正交视图6. 局部视图7. 显示隐藏 四、添加删除物体…

c++学习(异常)[28]

c语言处理错误机制 c异常概念 try {//保护的标识代码 }catch(ExceptionName e1) {//catch块 }catch(ExceptionName e2) {//catch块 }catch(ExceptionName eN) {//catch块 }匹配 优先调用链中最近的捕获 异常若不被捕获则报错终止程序 try { }catch ( ... ) //可以捕获任意类…

maven依赖继承总结

一:项目架构 二.父项目pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&qu…

集中/本地转发、AC、AP

1.ADSL ADSL MODEM&#xff08;ADSL 强制解调器&#xff09;俗称ADSL猫 ADSL是一种异步传输模式&#xff08;ATM)。ADSL是指使用电话线上网&#xff0c;需要专用的猫&#xff08;Modem)&#xff0c;在上网的时候高频和低频分离&#xff0c;所以上网电话两不耽误&#xff0c;速…

k8s存储卷

目录 一、为什么要存储卷&#xff1f;二、emptyDir存储卷三、hostPath存储卷四、 nfs共享存储卷五、PVC 和 PV5.1 PV和PVC之间的相互作用遵循的生命周期5.2 PV 的状态5.3 一个PV从创建到销毁的具体流程 六、静态创建pv和pvc资源由pod运用过程6.1 在NFS主机上创建共享目录&#…

阿里云“通义千问”开源,可免费商用

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 阿里云成为国内首个加入大模型开源行列的大型科技企业。就在昨天&#xff0c;阿里云公开表态&#xff0c;把自家的通义千问大模型开源。 阿里云把通用70亿参数模型&#xff0c;包括Qwen-7B和对话模…