栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(C++)STL(标准模板库)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(C++)STL(标准模板库)

目录

一、STL的概述

1、概述

2、特点

3、string 类

二、容器

1、概述

 2、vector 

3、deque

4、list

5、stack

6、queue

优先队列

7、set 容器

8、map容器

9、multimap


一、STL的概述

1、概述

//STL是由 容器、迭代器、空间适配器、适配器、算法、仿函数六大组件组成;

//STL包含了诸多在计算机科学领域里常用的基本数据机构和基本算法;并且降低了他们之间的耦合关系。

//STL是由惠普实验室开发的一系列软件的统称,现在主要应用于c++中。

2、特点

1.将数据结构和算法分离

2.不需要关心具体的实现过程,只要熟练使用STL就可以。

3.STL具有高度的可重用性,高性能,高移植性,跨平台

3、string 类

//不是STL容器,但是与STL容器有相似之处。

1. 是一个字符串类型,通常用来标识字符串

2.string和插入*的区别

1> string是一个类,char*是一个指向字符串的指针

2> string封装了char*,管理整个字符串,是一个char*的容器

3> string几乎不需要考虑内存越界和内存释放。

#include 
#include 
#include 
using namespace std;

int main(int argc, char const *argv[])
{
#if 0
    string s1;  //无参构造函数
    string s2("helloworld");  //有参构造函数
    string s3(10,'a'); //10个a
    string s4(s2);


    cout<>s1;   //重载了输入运算符
    cout< 0)     //s1 与 s2 比较
    {
        cout<<"s1 > s2"< 0)
    {
        cout<<"s1> s2"< 

二、容器 1、概述

容器就是将各种常用的数据结构,如数组、链表、栈、队列、二叉树等封装成一个个模板类,以方便编程。

 2、vector 

vector是将元素放置在一个动态数组中加以管理的容易,可以随机存取元素,[]或者at直接存取,vector在尾部存取元素十分迅速,但是在中部或者头部插入或者删除 元素比较费时。

#include 
#include 
#include 
using namespace std;

int main(int argc, char const *argv[])
{
#if 1
    int data[10] = {1,2,3,4,5,6,7,8,9,10};
    vector v1;                     //创建数组对象(模板类),无参构造函数
    vector v2(data, data + 10);    //显示调用,int类型
    vector v3(10, 1);                

    v1.resize(10);
    for(int i = 0; i < v1.size(); i++)
    {
        v1[i] = i;
    }

    for (int i = 0; i < v1.size(); i++)
    {
        cout<::iterator it = v3.begin(); it != v3.end(); it++)  //正向迭代
    {
        cout<<*it<<" ";
    }
    cout<::reverse_iterator rit = v2.rbegin(); rit != v2.rend(); rit++)
    {
        cout<<*rit<<" ";
    }                                           //反向迭代
    cout<::const_iterator cit = v2.begin(); cit != v2.end(); cit++)
    {
        //(*cit)++;     //只读容器
        cout<<*cit<<" ";
    }
    cout< v(s, s + strlen(s));     //char 类型

    for (vector::iterator it = v.begin(); it != v.end(); it++)  //迭代
    {
        cout<<*it;
    }
    cout<::iterator it = v.begin(); it != v.end(); it++)
    {
        cout<<*it;
    }
    cout<::iterator it = v.begin(); it != v.end(); it++)
    {
        cout<<*it;
    }
    cout<::iterator it = v.begin(); it != v.end(); it++)
    {
        cout<<*it;
    }
    cout<::iterator it = v.begin(); it != v.end(); it++)
    {
        cout<<*it;
    }
    cout<::iterator it = v.begin(); it != v.end(); it++)
    {
        cout<<*it;
    }
    cout< 

3、deque

deque:双端数组,而vector是单端数组,但是两者在接口上非常非常相似,许多操作可以直接替换,deque可以随机存取元素,使用[]或者at() 在deque中,在头部和尾部添加或者删除元素非常迅速,但是在中部添加或者删除则比较费事,头文件:#include

#include 
#include 
using namespace std;

int main(int argc, char const *argv[])
{
#if 1
    int data[5] = {1,2,3,4,5};

    deque d1;
    deque d2(data, data + 5);     //int 类型
    deque d3(10,1);

    d1.resize(10);
    for (int i = 0; i < d1.size(); i++)
    {
        d1[i] = i + 1;
    }

    for (int i = 0; i < d1.size(); i++)
    {
        cout<::iterator it = d2.begin(); it != d2.end(); it++)
    {
        cout<<*it<<" ";
    }
    cout<::iterator it = d2.begin(); it != d2.end(); it++)
    {
        cout<<*it<<" ";
    }
    cout<::iterator it = d2.begin(); it != d2.end(); it++)
    {
        cout<<*it<<" ";
    }
    cout<::iterator it = d2.begin(); it != d2.end(); it++)
    {
        cout<<*it<<" ";
    }
    cout<::iterator it = d2.erase(d2.begin());    //删除第一个元素
    cout<<*it<::iterator it = d2.begin(); it != d2.end(); it++)
    {
        cout<<*it<<" ";
    }
    cout< d(data, data + 10);

    for (deque::iterator it = d.begin(); it != d.end();)  //删除所有3
    {
        if (*it == 3)
        {
            d.erase(it);
        }
        else
        {
            it++;
        }
        
    }
    
    for (deque::iterator it = d.begin(); it != d.end() ; it++)
    {
        cout<<*it<<" ";
    }
    cout< 

4、list

list:是一个双向链表容器,可高效的进行插入和删除元素,list不支持随机存取元素,所以说不支持[]和at(),也不支持迭代器的随机访问

#include 
#include 
#include 
using namespace std;

class Student                  //与链表相同,需要自己定义节点的类型(结构体类型)
{                              //在C++中,通常用类,代替结构体类型
    private:
        int id;
        char name[32];

    public:
        Student(){}
        Student(int i, const char *n);
        void show();
        bool operator==(const Student &s);

};

Student::Student(int i, const char *n)
{
    id = i;
    strcpy(name, n);
}

void Student::show()
{
    cout<<"id = "< l;    //创建链表对象

    l.push_back(s1);  //尾插法
    l.push_back(s2);  //尾插法
    l.push_back(s3);  //尾插法
    l.push_back(s4);  //尾插法
    l.push_back(s5);  //尾插法
    l.push_back(s6);  //尾插法

    for (list::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }

    l.pop_back();   //删除最后一个节点
    l.pop_front();   //删除第一个节点

    cout<<"***********************"<::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }  

    cout<<"最后一个元素是:"<::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }  
    
    //对象数组
    cout<<"************************"<::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }  

    cout<<"************************"<::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }  

    cout<<"************************"<::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }  

    cout<<"删除一个区间"<::iterator it = l.begin();
    for (int i = 0; i < 5; i++)
    {
        it++;
    }
    l.erase(it, l.end());        //删除it 后面全部
     for (list::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }  

    cout<<"删除一个位置"<::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }  
    
    cout<<"删除具体元素"<::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }  

    cout<<"链表反转"<::iterator it = l.begin(); it != l.end(); it++)  //迭代
    {
        it->show();
    }  

    return 0;
}

5、stack

//包含头文件 #include

//栈:同样需要显示调用:如:stack s;

//push() 进栈; top() 栈顶元素; size() 栈的大小; empty()  是否为空; pop() 出栈;

#include 
#include 
#include 
#include 
using namespace std;

int main(int argc, const char *argv[])
{
    stack s;
    srand(sizeof(time(NULL)));
    
    int num;

    for (int i = 0; i < 10; i++)
    {
        num = rand()%10;
        s.push(num);
        cout< 

6、queue

//包含头文件 #include

//push() 进队; front() 队头元素; back() 队尾元素;empty() 是否为空; 

#include 
#include 
using namespace std;

int main(int argc, const char *argv[])
{
    queue q;

    int num;

    for (int i = 0; i < 10; i++)
    {
        num = i + 1;
        q.push(num);
        cout< 

优先队列

//priority_queue 优先队列;如:priority_queue p;

//pop() 出队;push()进队;top()栈顶;empty()栈空

#include 
#include 
#include 
#include 
using namespace std;

int main(int argc, char const *argv[])
{
    //priority_queue p;   //priority_queue, less> p; //由大到小排序
    //priority_queue, greater> p;  //由小到大排序,由动态数组构成
    priority_queue, less> p;      //由队列构成

    srand(sizeof(time(NULL)));
    int num;

    for (int i = 0; i < 10; i++)
    {
        num = rand()%10;
        p.push(num);
        cout< 

7、set 容器

//包含头文件 #include

//属于链式存储,故而也需要先定义节点(通过类定义);遍历就是要迭代

//链式存储是有序的,(由小到大 或 由大到小)

// insert() 插入数据; begin() 开始元素; end() 结尾元素; erase() 删除元素或区间;find() 查找(返回 地址);count() 统计相同节点个数;lower_bound() 找到一个比当前元素大一个的元素;

upper_bound() 找到一个比当前元素小一个的元素;

//pair 类的使用:如: pair<参数1,参数2>  p; 对象 p 可以通过访问两个参数(p.first;p.second),起到lower_bound();upper_bound()的作用

#include 
#include 
using namespace std;

class Student
{
    private:
        int id;
        string name;
    
    public:
        Student(int i, string n);
        void show() const;
        bool operator<(const Student &s) const;
        bool operator>(const Student &s) const;

};

Student::Student(int i, string s)
{
    id = i;
    name = s;
}

void Student::show() const
{
    cout<<"id = "< s;
    //set> s;  //greater<> 由小到大排序
    s.insert(s3);
    s.insert(s1);
    s.insert(s4);
    s.insert(s2);
    s.insert(s6);
    s.insert(s5);

    for (set::iterator it = s.begin(); it != s.end(); it++)
    {
        it->show();
    }
    
    cout<<"集合大小: "<::iterator it = s.begin(); it != s.end(); it++)
    {
        it->show();
    }

    cout<<"set区间删除"<::iterator it = s.begin(); it != s.end(); it++)
    {
        it->show();
    }

    cout<<"删除具体的元素"<::iterator it = s.begin(); it != s.end(); it++)
    {
        it->show();
    }

    cout<<"set的查找"<::iterator it = s.find(s4);
    if (it == s.end())
    {
        cout<<"对象不存在"<show();
    }

    cout<<"set的统计"<show();
    }

    cout<<"upper_bound"<show();
    }

    cout<<"**********************"<::iterator it = s.begin(); it != s.end(); it++)
    {
        it->show();
    }
    cout<<"equl_range"<::iterator, set::iterator> p;
    p = s.equal_range(s4);
    p.first->show();                //第一个变量:lower_bound
    p.second->show();               //第二个变量:upper_bound

    return 0;
}

8、map容器

//map 容器包含两个部分:键(key)、值(value)

//在访问map 对象的内容时,需要指向 键(key)和值(value)两个数据

//begin() 开始元素; end() 结尾元素; erase() 删除元素或区间;

insert() 插入数据;//在接口括号中,调用其它接口

(1)pair(1,"zz")    //通过pair对组(组合一组数据)插入

(2)make(1,"aa")    //通过make_pair组合一对数据插入

(3)map::value_type(1,"cc");  //通过map内部的静态成员函数插入

(4)m[1] = “aa”;    //map重载了[ ]运算符,进行插入

#include 
#include 
using namespace std;

int main(int argc, char const *argv[])
{
    map m;   //key是int型,value是string类型


    m.insert(pair(3,"aa"));  //通过pair对组(组合一组数据)插入
    m.insert(pair(1,"zz"));


    m.insert(make_pair(5,"cc"));         //通过make_pair组合一对数据插入
    m.insert(make_pair(2,"dd"));


    m.insert(map::value_type(6,"hh"));
    m.insert(map::value_type(4,"vv"));  //通过map内部的静态成员函数插入


    m[8] = "uu";  //map重载了[]运算符
    m[7] = "qq";


    for(map::iterator it = m.begin(); it != m.end();it++)
    {
        //it指向map的一个结点,一个结点就是一个pair对象,即it指向pair对象,pair对象有两个成员,first和second
        cout<<"key: "<first<<" value :"<second<::iterator,bool> p = m.insert(make_pair(5,"ll"));
    if(p.second == false)
    {
        cout<<"插入失败"<first<<" value :"<second<::iterator it = m.begin(); it != m.end();it++)
    {
       
        cout<<"key: "<first<<" value :"<second<::iterator it = m.begin(); it != m.end();it++)
    {
       
        cout<<"key: "<first<<" value :"<second<::iterator it = m.begin(); it != m.end();it++)
    {
       
        cout<<"key: "<first<<" value :"<second<::iterator it = m.begin(); it != m.end();it++)
    {
       
        cout<<"key: "<first<<" value :"<second< 

9、multimap

一个key值可以对应多个value

案例:

公司: 销售部:2名

技术研发部:1名

财务部:2名

人员信息:姓名,年龄,电话,工资等组成

通过multimap进行信息的插入,保存,显示

分部门显示员工信息

#include 
#include 
using namespace std;

class Employee
{
    private:
        int id;
        string name;
    public:
        Employee(int i,string n)
        {
            id = i;
            name = n;
        }
        void show()
        {
            cout<<"工号:"< m;   //对象 m 包含了 string、Employee 两个类
                                   //从而达到一个 key 包含多个 信息(value)
    //销售部有三个员工
    m.insert(make_pair("Sale",e1));
    m.insert(make_pair("Sale",e2));
    m.insert(make_pair("Sale",e3));
    //研发部有一个员工
    m.insert(make_pair("development",e4));
    //财务部门有四个员工
    m.insert(make_pair("Finance",e5));
    m.insert(make_pair("Finance",e6));
    m.insert(make_pair("Finance",e7));
    m.insert(make_pair("Finance",e8));

    cout<::iterator it = m.begin();it != m.end();it++)
    {
        cout<<"部门:"<first<second.show();
    }
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942588.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号