STL学习

news/2024/11/24 6:45:30/

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.ppmy.cn/news/1005998.html

相关文章

集成学习算法是什么?如何理解集成学习?

什么是集成学习&#xff1f; 集成学习通过建立几个模型来解决单一预测问题。它的工作原理是生成多个分类器/模型&#xff0c;各自独立地学习和作出预测。这些预测最后结合成组合预测&#xff0c;因此优于任何一个单分类的做出预测。 机器学习的两个核心任务 任务一&#xff1…

Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。

文章目录 前言一、原因分析二、解决方案 前言 前面我也有提到&#xff0c;发现flink运行一段时间后&#xff0c;不再继续消费的问题。这个问题困扰了我非常久&#xff0c;一开始也很迷茫。又因为比较忙&#xff0c;所以一直没有时间能够去寻找答案&#xff0c;只是通过每天重启…

Consul屏蔽api

consul 没有设置密码 需要屏蔽api&#xff1a;/v1/internal/ui/nodes?dc&token 防止信息泄露 配置config.json {"http_config": {"block_endpoints": ["/v1/internal/ui/nodes"]} }启动consul时使用该配置&#xff1a; consul agent -de…

Go语言在人工智能时代的崭露头角:为何越来越多公司选择使用Go语言?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to Golang Language.✨✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1…

Unity Image(RawImage) 实现按轴心放大缩小,序列化存储轴心信息,实现编译器窗口保存轴心

工作时分配给我的要实现的功能&#xff0c;写的时候遇到挺多的坑的&#xff0c;在此记录一下 效果 放大缩小的效果 2.编译器扩展窗口记录 实现点 1.Json序列化存储图片轴心位置, 放大倍率&#xff0c;放大所需要的事件 2.用了编译器扩展工具便于保存轴心信息坑点 1.Imag…

实现多线程的三种方式

1. 继承Thread 类实现多线程 想要实现多线程&#xff0c;第一种方法就是通过继承Thread类实现多线程&#xff0c;有以下几步 &#xff08;1&#xff09;我们要先自定义一个类然后继承Thread类&#xff1b; &#xff08;2&#xff09;在继承Trread的类中重写 run 方法&#x…

07 Ubuntu中使用poetry工具管理python环境——巨详细!!!

由于conda和ros2的环境实在太容易冲突了。我真的不敢再使用conda&#xff0c;着实是有些搞不明白这解释器之间的关系。 conda的卸载和ros2的安装暂不赘述&#xff0c;下面着重来说如何在Ubuntu中使用poetry进行包管理及遇到的问题。 1 安装poetry 由于在有写入权限的限制&am…

【ASP.NET MVC】使用动软(一)(9)

一、解决的问题 前文为解决数据库操作设计的 TestMysql 类&#xff0c;仅简单地封装了一个Query函数&#xff0c;代码如下&#xff1a; public class TestMysql{public static string SqlserverConnectStr "server127.0.0.1;charsetutf8;user idroot;persistsecurityin…