STL学习

news2024/11/16 5:55: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.coloradmin.cn/o/839280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FDM3D打印系列——超可动可变形机体打印

大家好&#xff0c;我是阿赵。继续来分享一下3D打印的成果。   这次打印的对象不得了&#xff0c;是超时空要塞系列的可变形VF战机。打印完这个模型&#xff0c;绝对是学习到了很多的东西&#xff0c;下面给大家分享一下。 一、成果展示&#xff1a; 不要怀疑&#xff0c;不…

《GPU并行计算与CUDA编程》笔记

第一个GPU程序 #include <stdio.h>__global__ void square(float* d_out,float* d_in){int idx threadIdx.x;float f d_in[idx];d_out[idx] f * f; }int main(int argc,char** argv){const int ARRAY_SIZE 8;const int ARRAY_BYTES ARRAY_SIZE * sizeof(float);// …

在linux调试进程PID的方法

当我们谈论调试 PID&#xff08;进程标识符&#xff09;时&#xff0c;我们通常是指诊断和解决与操作系统中的特定进程相关的问题。有许多工具和方法可用于调试 PID&#xff0c;以下是一些常见的方法&#xff1a; 1. 使用ps命令 ps命令是最基本的调试工具&#xff0c;用于查看…

python数据处理程序代码,如何用python处理数据

大家好&#xff0c;给大家分享一下python数据处理程序代码&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 要求&#xff1a;分别以james&#xff0c;julie&#xff0c;mikey&#xff0c;sarah四个学生的名字建立文本文件&#xff0c;分别存…

Win32 EditControl多行文本框自动换行,并在添加新行时自动将光标移到末尾

【文本框属性设置】 设为多行文本框&#xff1a;MultilineTrue 允许按回车键换行&#xff1a;Want ReturnTrue 自动换行&#xff1a;Auto HScrollFalse 在最后一行按回车键&#xff0c;自动向上滚动&#xff1a;Auto VScrollTrue 显示垂直滚动条&#xff1a;Vertical ScrollTru…

Cocos Creator的rigidBody.applyForce变成了滚动

序: 1、原因是因为没有调整摩擦系数physics-material 2、摩擦系数调整你要在你的节点 一个物理材料才会有的&#xff0c;教程没跳过去了所以没有 3、扩展阅读第一话&#xff1a;入行程序员的一波三折 最终效果&#xff1a; git录屏会卡&#xff0c;其实过程很平滑 正…

PostgreSQL和MySQL多维度对比

文章目录 0.前言1. 基础对比2.PostgreSQL和MySQL语法对比3. 特性4. 参考文档 0.前言 在当今的软件开发和数据管理领域&#xff0c;数据库是至关重要的基础设施之一。选择正确的数据库管理系统&#xff08;DBMS&#xff09;对于应用程序的性能、可扩展性和数据完整性至关重要。…

无涯教程-Perl - do...while 语句函数

与 for 和 while 循环不同&#xff0c;它在循环的顶部测试循环条件&#xff0c;而 do ... while 循环在以下位置检查其条件:循环的底部。 do ... while 循环与while循环相似&#xff0c;除了保证do ... while循环至少执行一次。 do...while - 语法 do {statement(s); }while(…

PintOS lab1 threads 实验记录

Background 首先完成这个实验我们需要理清线程怎么启动的和切换的 下面这张图可以大体表示线程状态的切换 让我们看看thread init的前世今生吧&#xff08;: 从start.S汇编调用了一个c函数 pintos_init初始化了一堆东西&#xff0c;当然里面也包括了thread啦 int pintos_in…

计算机网络(5) --- http协议

计算机网络&#xff08;4&#xff09; --- 协议定制_哈里沃克的博客-CSDN博客协议定制https://blog.csdn.net/m0_63488627/article/details/132070683?spm1001.2014.3001.5501 目录 1.http协议介绍 1.协议的延申 2.http协议介绍 3.URL 4.urlencode和urldecode 2.HTTP协…

langchain-ChatGLM源码阅读:参数设置

文章目录 上下文关联对话轮数向量匹配 top k控制生成质量的参数参数设置心得 上下文关联 上下文关联相关参数&#xff1a; 知识相关度阈值score_threshold内容条数k是否启用上下文关联chunk_conent上下文最大长度chunk_size 其主要作用是在所在文档中扩展与当前query相似度较高…

HCIP MPLS综合实验

目录 题目 实验步骤 第一步、IP地址规划 第二步、配置接口IP地址 第三步、IGP配置OSPF 第五步、公网配置MPLS 第五步、使用MPLS-VPN 第六步、R2-R4使用BGP建邻并实现VPN建邻 第六步、配置B静态路由 第七步、配置B动态路由 第八步、重发布 第九步、测试 题目 1、R1…

GO语言的垃圾回收机制

内存垃圾的产生 程序在内存上被分为堆区、栈区、全局数据区、代码段、数据区五个部分。对于C等早期编程语言栈上的内存回由编译器负责管理回收&#xff0c;而堆上的内存空间需要编程人员负责申请和释放。在Go中栈上内存仍由编译器负责管理回收&#xff0c;而堆上的内存由编译器…

王道计网 第四章笔记

4.1 生活在网络层的“工人”是路由器,他负责各种异构网络的连接,但是因为他只生活在前三层所以从网络层之上的东西他不能管理,所以网路层之上的数据对于路由器来说必须是相同的、透明的。 常见的网络层协议有IP 和 ICMPTCP IP传输层协议FTP应用层协议一句话区分IP和MAC地址…

Typescript - 索引签名

目录 1&#xff0c;什么是索引签名1&#xff0c;js 中使用对象的属性2&#xff0c;ts 中的索引签名3&#xff0c;扩展索引签名定义的类型 2&#xff0c;与 Record 对比3&#xff0c;遇到的问题1&#xff0c;索引 key 的类型问题&#xff0c;keyof2&#xff0c;索引 key 的类型问…

CADintosh X for mac CAD绘图软件2D CAD 程序 兼容 M1

CADintosh X for Mac是一个功能强大的2D CAD绘图程序&#xff0c;专为Mac用户设计。它由Lemke Software开发&#xff0c;提供了一套丰富的工具和功能&#xff0c;使用户能够轻松创建高质量的技术图纸&#xff0c;平面图和设计。 CADintosh X for Mac具有直观的用户界面&#x…

Python3 处理PDF之PyMuPDF 入门

PyMuPDF 简介 PyMuPDF是一个用于处理PDF文件的Python库&#xff0c;它提供了丰富的功能来操作、分析和转换PDF文档。这个库的设计目标是提供一个简单易用的API,使得开发者能够轻松地在Python程序中实现PDF文件的各种操作。 PyMuPDF的主要特点如下&#xff1a; 跨平台兼容性&a…

【分布式系统】聊聊服务调度

什么是服务治理 对于程序员来说的话&#xff0c;把功能按照一定的设计进行开发上线之后&#xff0c;其实并不够&#xff0c;在未来的时间内&#xff0c;其实还需要做好功能的维护工作&#xff0c;而维护项目的成本远远高于开发出一个软件的成本。 对于功能开发起来期来说&am…

ensp-GVRP服务

ensp-GVRP服务 日期&#xff1a;6-26 &#x1f4ce;GVRP实验.zip&#x1f4ce;GVRP服务.docx

无涯教程-Perl - 环境配置

在开始编写Perl程序之前&#xff0c;让我们了解如何设置我们的Perl环境。 您的系统更有可能安装了perl。只需尝试在$提示符下给出以下命令- $perl -v 如果您的计算机上安装了perl&#xff0c;那么您将收到以下消息: This is perl 5, version 16, subversion 2 (v5.16.2) b…