C++顺序容器(vector、deque、list)的使用详解

目录
  • 一:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库
  • 二:STL组件
  • 三:容器
  • 四:类型成员
  • 五:迭代器
  • 六:顺序容器
  • 七:顺序容器--向量(vector)
  • 八:顺序容器--双端队列--deque
  • 九:顺序容器 --列表--list

一:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库

1.从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,基于模板(template)。
2.从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming),在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。

二:STL组件

1.Container(容器) 各种基本数据结构

2.Algorithm(算法) 各种基本算法如 sort search等

3.Iterator(迭代器) 连接containers 和 algorithms

4.了解:

  • Adapter(适配器) 可改变containers或function object接口的一种组件
  • Function object(函数对象) *
  • Allocator(分配器)*

三:容器

1.容器类是容纳、包含一组元素或元素集合的对象

2.七种基本容器:

向量(vector)、双端队列(deque)、链表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)

四:类型成员

1.循环子操作:

  • begin():指向第一个元素
  • end():指向最后一个元素的后一个位置
  • rbegin():指向逆序的第一个元素
  • rend():指向逆序的最后一个元素的后一个位置

2.访问元素操作

  • front():访问第一个元素
  • back():访问最后一个元素
  • [ ]:无测试的下标访问(不用于 list)
  • at():有测试的下标访问(只用于 vector 和 deque)

3.堆栈和队列操作

  • push_back():将新元素加入到尾部
  • pop_back():移出最后一个元素
  • push_front():将新元素加入头部(只用于 list 和 deque)
  • pop_front():移出第一个元素(只用于 list 和 deque)

4.表操作

  • insert(p,x):将元素x加入到 p 之前
  • erase(p):删除p处的元素
  • clear():清除所有的元素

五:迭代器

迭代器是面向对象版本的指针,它们提供了访问容器、序列中每个元素的方法

六:顺序容器

顺序容器的接口

1.插入方法:push_front(),push_back(),insert(),运算符“=”

2.删除方法:pop() ,erase(),clear()

3.迭代访问方法:使用迭代器

4.其他顺序容器访问方法(不修改访问方法):front(),back(),下标[ ]运算符

七:顺序容器--向量(vector)

a.向量属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)

b.数据结构很像一个数组,所以与其他容器相比,vector 能非常方便和高效访问单个元素,支持随机访问迭代子

c.向量是动态结构,它的大小不固定,可以在程序运行时增加或减少

d.与数组不同,向量的内存用尽时,向量自动分配更大的连续内存区,将原先的元素复制到新的内存区,并释放旧的内存区。这是向量类的优点。

头文件:#include <vector>

例子:

1.push_back尾部添加

#include<iostream>
using namespace std;
#include<vector>

void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<int> v;

    //迭代器
    vector<int>::iterator it;
    it = v.begin(); //开始位置

    //在尾部添加
    v.push_back(1);
    v.push_back(12);
    //迭代器指针 遍历向量容器
    for(it = v.begin();it<v.end();it++)
    {
        cout<<" "<<*it;  //取值
    }
    // 1 12
    cout<<endl;
}

2.insert按照位置插入

#include<iostream>
using namespace std;
#include<vector>

void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<int> v;
    //迭代器
    vector<int>::iterator it;
    it = v.begin(); //开始位置

    //在尾部添加
    v.push_back(1);
    v.push_back(12);
    //按照位置插入
    v.insert(v.begin(),100);

    for(it = v.begin();it<v.end();it++)
    {
        cout<<" "<<*it;  //取值
    }
    //  100 1 12
    cout<<endl;
}

3.获取id(成员属性)

CStaff.h

#ifndef CSTAFF_H
#define CSTAFF_H
#define ADMIN 1
#define MANAGER 2
#define WAITER 3
#include<string>
#include<iostream>
using namespace std;

class Staff
{
public:
    Staff();
    Staff(int id,string name,string pwd,int prole);
    ~Staff();
    int getId();
    string getName();
    string getPwd();
    int getRole();
private:
    int ID;
    string name;
    string pwd;
    int role;
};

#endif

CStaff.cpp

#include"CStaff.h"
#include<iostream>
using namespace std;

Staff::Staff()
{
}

Staff::Staff(int id,string name,string pwd,int prole)
{
    this->ID = id;
    this->name = name;
    this->pwd = pwd;
    this->role = prole;
}

int Staff::getId()
{
    return this->ID;
}

string Staff::getName()
{
    return this->name;
}

string Staff::getPwd()
{
    return this->pwd;
}

int Staff::getRole()
{
    return this->role;
}

Staff::~Staff()
{
}

main.cpp

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<Staff *> staffV;
    vector<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));
    staffV.insert(staffV.begin(),new Staff(1003,"sam","1234",MANAGER));

    for(it=staffV.begin();it<staffV.end();it++)
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }
//    id:1003
//  id:1001
//  id:1002
}

4.按照位置插入insert --- 需要迭代器指针it++偏移

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<Staff *> staffV;
    vector<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    it = staffV.begin();  //开始位置
    it++;
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));

    for(it=staffV.begin();it<staffV.end();it++)
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }
//id:1001
//id:1003
//id:1002
}

5.尾部删除pop_back

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<Staff *> staffV;
    vector<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    it = staffV.begin();  //开始位置
    it++;
    //按照位置插入
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));
    //尾部删除
    staffV.pop_back();

    for(it=staffV.begin();it<staffV.end();it++)
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }
//    id:1001
//  id:1003
}

6. erase按照位置删除

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<Staff *> staffV;
    vector<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    it = staffV.begin();  //开始位置
    it++;
    //按照位置插入
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));
    //尾部删除
    staffV.pop_back();

    it = staffV.begin();  //开始位置
    staffV.erase(it);//删除第一个

    for(it=staffV.begin();it<staffV.end();it++)
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }
//id:1003
}

7.erase按照位置删除(迭代器指针偏移it++)

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<Staff *> staffV;
    vector<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    it = staffV.begin();  //开始位置
    it++;
    //按照位置插入
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));

    //尾部删除
    staffV.pop_back();

    it = staffV.begin();  //开始位置
    it++;
    staffV.erase(it);//删除第二个

    for(it=staffV.begin();it<staffV.end();it++)
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }
//id:1001
}

8.size计数

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<Staff *> staffV;
    vector<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    it = staffV.begin();  //开始位置
    it++;
    //按照位置插入
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));

    cout<<"员工数量:"<<staffV.size()<<endl;
    for(it=staffV.begin();it<staffV.end();it++)
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }
//员工数量:3
//id:1001
//id:1003
//id:1002
}

9.容器访问四种

1.迭代器指针  2.at访问方式 3.[ ]中括号访问方式  4.C++新增auto访问方式

at访问方式:

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<Staff *> staffV;
    vector<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    it = staffV.begin();  //开始位置
    it++;
    //按照位置插入
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));

    cout<<"员工数量:"<<staffV.size()<<endl;
/*    for(it=staffV.begin();it<staffV.end();it++)//迭代器指针遍历
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }*/
    for(int i =0;i<staffV.size();i++)  //下标法
    {
        cout<<"id:"<<staffV.at(i)->getId()<<endl;
    }
//员工数量:3
//id:1001
//id:1003
//id:1002
}

[ ]中括号访问方式

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<Staff *> staffV;
    vector<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    it = staffV.begin();  //开始位置
    it++;
    //按照位置插入
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));

    cout<<"员工数量:"<<staffV.size()<<endl;
/*    for(it=staffV.begin();it<staffV.end();it++)//迭代器指针遍历
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }*/
    for(int i =0;i<staffV.size();i++)  //下标法
    {
        //cout<<"id:"<<staffV.at(i)->getId()<<endl;
        cout<<"id:"<<staffV[i]->getId()<<endl;
    }
//员工数量:3
//id:1001
//id:1003
//id:1002
}

10.clear清空

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
void demo_vector();

int main()
{
    demo_vector();
    return 0;
}

void demo_vector()
{
    vector<Staff *> staffV;
    vector<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    it = staffV.begin();  //开始位置
    it++;
    //按照位置插入
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));

    cout<<"员工数量:"<<staffV.size()<<endl;
/*    for(it=staffV.begin();it<staffV.end();it++)//迭代器指针遍历
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }*/
    for(int i =0;i<staffV.size();i++)  //下标法
    {
        //cout<<"id:"<<staffV.at(i)->getId()<<endl;
        cout<<"id:"<<staffV[i]->getId()<<endl;
    }
    staffV.clear();
     cout<<"员工数量:"<<staffV.size()<<endl;
//员工数量:3
//id:1001
//id:1003
//id:1002
//员工数量:0
}

八:顺序容器--双端队列--deque

a.双端队列是一种放松了访问权限的队列。元素可以从队列的两端入队和出队,也支持通过下标操作符“[]”进行直接访问。

b.与向量的对比 功能上:和向量没有多少区别,

性能上:在双端队列起点上的插入和删除操作快

头文件:#include <deque>

1.push_front头部插入

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
#include<deque>
void demo_deque();

int main()
{
    demo_deque();
    return 0;
}

void demo_deque()
{
    deque<Staff *> staffV;
    deque<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    it = staffV.begin();  //开始位置
    it++;
    //按照位置插入
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));

    //头部插入
    staffV.push_front(new Staff(1004,"lilei","1234",MANAGER));

    cout<<"员工数量:"<<staffV.size()<<endl;
/*    for(it=staffV.begin();it<staffV.end();it++)//迭代器指针遍历
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }*/
    for(int i =0;i<staffV.size();i++)  //下标法
    {
        //cout<<"id:"<<staffV.at(i)->getId()<<endl;
        cout<<"id:"<<staffV[i]->getId()<<endl;
    }
//    staffV.clear();
//     cout<<"员工数量:"<<staffV.size()<<endl;
//员工数量:4
//id:1004
//id:1001
//id:1003
//id:1002
}

2.pop_front头部删除

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
#include<deque>
void demo_deque();

int main()
{
    demo_deque();
    return 0;
}

void demo_deque()
{
    deque<Staff *> staffV;
    deque<Staff *>::iterator it;

    staffV.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffV.push_back(new Staff(1002,"lily","1234",ADMIN));

    //头部插入
    staffV.push_front(new Staff(1004,"lilei","1234",MANAGER));

    it = staffV.begin();  //开始位置
    //it++;

    //按照位置插入
    staffV.insert(it,new Staff(1003,"sam","1234",MANAGER));  // 3 4 1 2

    staffV.pop_front();  //头部删除

    cout<<"员工数量:"<<staffV.size()<<endl;
/*    for(it=staffV.begin();it<staffV.end();it++)//迭代器指针遍历
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }*/
    for(int i =0;i<staffV.size();i++)  //下标法
    {
        //cout<<"id:"<<staffV.at(i)->getId()<<endl;
        cout<<"id:"<<staffV[i]->getId()<<endl;
    }
//    staffV.clear();
//     cout<<"员工数量:"<<staffV.size()<<endl;
//员工数量:3
//id:1004
//id:1001
//id:1002
}

九:顺序容器 --列表--list

a.链表主要用于存放双向链表,可以从任意一端开始遍历。链表还提供了拼接(splice)操作,将一个序列中的元素从插入到另一个序列中。

b.对比:元素的插入和删除操作对 list 而言尤为高效

与 vector 和 deque 相比,对元素的下标访问操作的低效是不能容忍的,因此 list 不提供这类操作。

头文件:#include <list>

list只支持迭代器法

for(it=staffList.begin();it!=staffList.end();it++)//迭代器指针遍历

1.只支持迭代器指针遍历

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
#include<deque>
#include<list>
void demo_list();

int main()
{
    demo_list();
    return 0;
}

void demo_list()
{
    list<Staff *> staffList;
    list<Staff *>::iterator it;

    staffList.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffList.push_back(new Staff(1002,"lily","1234",ADMIN));

    //头部插入
    staffList.push_front(new Staff(1004,"lilei","1234",MANAGER));

    it = staffList.begin();  //开始位置
    //it++;
    //按照位置插入
    staffList.insert(it,new Staff(1003,"sam","1234",MANAGER));  // 3 4 1 2

    staffList.pop_front();  //头部删除

    cout<<"员工数量:"<<staffList.size()<<endl;
    for(it=staffList.begin();it!=staffList.end();it++)//迭代器指针遍历
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }
//员工数量:3
//id:1004
//id:1001
//id:1002
}

2.把一个链表(单个元素)里的东西放到另外一个链表中--splice

#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
#include<deque>
#include<list>
void demo_list();

int main()
{
    demo_list();
    return 0;
}

void demo_list()
{
    list<Staff *> staffList;

    list<Staff *> list2;//再一个链表
    list2.push_back(new Staff(1006,"mei","1234",ADMIN));//有一个1006

    staffList.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffList.push_back(new Staff(1002,"lily","1234",ADMIN));

    //头部插入
    staffList.push_front(new Staff(1004,"lilei","1234",MANAGER));

    list<Staff *>::iterator it;
    it = staffList.begin();  //开始位置
    it++;                    //在第二个位置插入1006
  //splice move element from list to list
    staffList.splice(it,list2);

    cout<<"员工数量:"<<staffList.size()<<endl;
    for(it=staffList.begin();it!=staffList.end();it++)//迭代器指针遍历
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }
    cout<<"员工数量:"<<list2.size()<<endl;
//员工数量:4
//id:1004
//id:1006
//id:1001
//id:1002
//员工数量:0
}
#include<iostream>
using namespace std;
#include"CStaff.h"
#include<vector>
#include<deque>
#include<list>
void demo_list();

int main()
{
    demo_list();
    return 0;
}

void demo_list()
{
    list<Staff *> staffList;

    list<Staff *>list2;//再一链表
    list2.push_back(new Staff(1006,"mei","1234",ADMIN));  //有1006 1007
    list2.push_back(new Staff(1007,"didi","1234",ADMIN));

    staffList.push_back(new Staff(1001,"admin","1234",ADMIN));
    staffList.push_back(new Staff(1002,"lily","1234",ADMIN));

    //头部插入
    staffList.push_front(new Staff(1004,"lilei","1234",MANAGER));

    list<Staff *>::iterator it;
    it = staffList.begin();  //开始位置
    it++;                    //在第二个位置插入1006 1007
//splice move element from list to list
    staffList.splice(it,list2);

    cout<<"员工数量:"<<staffList.size()<<endl;
    for(it=staffList.begin();it!=staffList.end();it++)//迭代器指针遍历
    {
        cout<<"id:"<<(*it)->getId()<<endl;
    }
    cout<<"员工数量:"<<list2.size()<<endl;
//员工数量:5
//id:1004
//id:1006
//id:1007
//id:1001
//id:1002
//员工数量:0
}

到此这篇关于C++顺序容器(vector、deque、list)的使用详解的文章就介绍到这了,更多相关C++ 顺序容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 基础函数的介绍及使用(Vector+deque)

    目录 一.Vector的基础函数 1. 构造函数 2. 增加元素 3. 删除元素 4. 遍历vector 5. 判断函数 6. 大小函数 7. 其他函数 二.deque的介绍及使用 三.deque 和 vector的差别 1.构造函数 2.常用成员函数 3.特点 一.Vector的基础函数 之前有学习过 vector.set.map等容器,都是需要什么搜什么,没有详细的了解其中的内容.最近在看 STL 的相关内容,就顺手整理一些基础性内容,避免以后遇到的时候再临时抱佛脚. 1. 构造函数 vec

  • C++ 动态数组模版类Vector实例详解

    目录 1.实现机制 2.代码实现 3.测试运行 总结 1.实现机制 内部主要通过m_capacity数组容量成员和m_length数组有效长度成员来维护一个T* data数组空间. 内部默认分配一定数量大小的数组指针,每次append尾部追加的时候,无需再次分配空间,直接赋值标志length长度,假如超过当前空间容量,则再次扩大分配新的内存数组,并将旧数组拷贝至新数组及释放旧数组. Vector需要实现的public函数如下所示: inline int capacity() : 获取容量 inl

  • 一篇文章让你轻松理解C++中vector和list区别

    目录 一张表格让你理解vector和list区别 例子 总结 一张表格让你理解vector和list区别 区别 vector list 数据结构: 顺序表(动态数组) 环形双向链表 物理空间: 连续的 非连续的 内存消耗: 少 多 大小可变: 可变-动态数组 可变-通过指针 随机存储: 支持(vector 重载了[]) 不支持(因为非连续) 优势: 支持随机存储 任意节点高效的插入.删除等操作 劣势: 插入和删除进行内存拷贝工作 不支持随机存取 数据结构对比图: 那我们怎样选择使用vector和

  • 深入分析C++中deque的使用

    首先,当考虑到内存分配和执行性能的时候,使用std::deque要比std::vector好. Deque总览 deque和vector一样都是标准模板库中的内容,deque是双端队列,在接口上和vector非常相似,在许多操作的地方可以直接替换.假如读者已经能够有效地使用vector容器,下面提供deque的成员函数和操作,进行对比参考. 函数 描述 c.assign(beg,end)c.assign(n,elem)  将[beg; end)区间中的数据赋值给c.将n个elem的拷贝赋值给c.

  • C++ STL入门教程(3) deque双向队列使用方法

    一.简介 deque(Double Ended Queues,双向队列)和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样). 二.完整程序代码 /*请务必运行以下程序后对照阅读*/ #include <deque> #include <iostream> #include <algorithm> #include <stdexcept> using namespace std; void print(int num) { cout <&

  • C++中vector迭代器失效问题详解

    目录 问题: (1)删除vector中所有的偶数 (2)vector容器插入元素问题 迭代器失效原因 解决: 总结 问题: (1)删除vector中所有的偶数 #include <iostream> #include <vector> using namespace std; int main() { vector<int> vec; for (int i = 0; i < 10; ++i) { vec.push_back(i); } //把vec容器中的所有偶数

  • C++ deque容器的用法详解

    deque(双端队列)是由一段一段的定量连续空间构成,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速. 在中间部分安插元素则比较费时,因为必须移动其它元素. deque容器的构造函数 //deque和vector的区别 //deque对于头部的插入和删除效率低,数据量越大,效率越低 //deque相对而言,对于头部的插入和删除比vector快 //deque访问元素时的速度比vector要慢,和两者的内部实现有关 #include <iostream> #include <deq

  • C++模板以及实现vector实例详解

    目录 函数模板 类模板 Vector实现 简单的类模板实现代码及测试: win msvc编译器的实现: 容器的空间配置器 运算符重载与迭代器实现 最终vector的实现代码 总结 函数模板 函数模板:是不进行编译的,因为类型还不知道 模板的实例化:函数调用点进行实例化 模板函数:才是要被编译器所编译的 模板类型参数:typyname/class 模板非类型参数:模板非类型形参的详细阐述 模板的实参推演:可以根据用户传入的实参的类型,来推导出模板类型参数的具体 模板的特例化(专用化)的实例化 模板

  • C++入门之vector的底层实现详解

    目录 前言 定义初始结构 声明构造函数 容量有关操作 获取有效数据大小size() 获取数据容量capacity() 增加容量reserve() 重置大小resize() 迭代器 数据操作 尾插push_back() 尾删pop_back() 某一位置插入 insert() 某一位置删除 erase() 拷贝构造 []访问操作 =赋值操作 特别注意!!! 总结 前言 上一小节,我们讲解了vector的使用,也大概了解了其创建对象,增删改查数据等操作.那么今天,我们就来大致实现一下吧. 定义初始结

  • C++顺序容器(vector、deque、list)的使用详解

    目录 一:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库 二:STL组件 三:容器 四:类型成员 五:迭代器 六:顺序容器 七:顺序容器--向量(vector) 八:顺序容器--双端队列--deque 九:顺序容器 --列表--list 一:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库 1.从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,基

  • C++(STL库)之顺序容器vector的使用

    一.特点 ①总的来说:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 ②元素保存在连续的内存空间中,因此通过下标取值非常快 ③在容器中间位置添加或删除元素非常耗时 ④一旦内从重分配,和原vector相关的指针,引用,迭代器都失效.内存重分配耗时很长 二.头文件.using声明 头文件:#include <vector> using声明:using std::vector; 三.初始化 vector<T>  v1; ==>v1是一个空的vector ve

  • docker容器的创建及常用操作命令详解

    目录 docker容器简介 1.创建容器 2.查看本机的容器列表 3.停止和启动一个容器 4.删除容器 5.查看容器内容 6.复制命令 7.进入容器 docker容器简介 容器就是对外提供服务的一个实例. 容器启动的必要条件:容器内至少有一个进程运行在前台 1.创建容器 # 格式 docker run [参数] [镜像名称] [运行容器的启动命令] # 参数 -d : 以守护进程的方式运行一个容器 docker run -d [镜像名称] [cmd] --name : 指定容器的名称 docke

  • 微信小程序视图容器和基本内容组件图文详解

    目录 前言 一,视图容器类组件 1.1 view 1.2 srcoll-view 1.3 swiper和swiper-item 二,基本内容组件 2.1 text 2.2 rich-text 总结 前言 开发者可以通过运用组件快速搭建出页面结构,上一章也有对组件进行介绍,那么本文牛牛就来带大家学习小程序的组件. 我们可以将组件理解为微信内嵌的标签,它在小程序承担的作用与HTML的标签一致,不过组件的功能更加多样.具体. 事不宜迟,让我们开冲! 一,视图容器类组件 1.1 view 普通视图容器,

  • C++中vector的模拟实现实例详解

    目录 vector接口总览 默认成员函数 构造函数 拷贝构造 赋值重载 析构函数 迭代器相关函数 begin和end 容量相关函数 size和capacity reserve resize empty 修改容器相关函数 push_back pop_back insert erase swap 访问容器相关函数 operator[ ] 总结 vector接口总览 namespace nzb { //模拟实现vector template<class T> class vector { publi

  • Java中Vector与ArrayList的区别详解

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体实现类的相关区别如下:1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中.当从ArrayList的中间位置插入或者删除元素时,需要对数组

  • Java中的vector类使用方法示例详解

     基本操作示例 VectorApp.java import java.util.Vector; import java.lang.*; import java.util.Enumeration; public class VectorApp { public static void main(String args[]) { Vector v1 = new Vector(); Integer integer1= new Integer(1); //加入为字符串对象 v1.addElement("

  • docker中容器的网络配置常用命令详解

    网络基础配置 虽然Docker可以根据镜像"多开"容器,并而每个容器互不影响,但并不代表容器与容器之间是完全决裂的.Docker在运行镜像的时候提供了映射容器端口到宿主主机.容器端口到另一个容器的网络互联功能,使得容器与宿主主机.容器与容器之间可以相互通信. ### 从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外是无法通过网络来访问容器内的网络应用和服务的.当容器中运行一些需要被外部访问的网络应用时,可以通过-P或者-p参数来指定端口映射.当使用-P标记时,Doc

  • Docker容器搭建并运行实现过程详解

    直接拉取镜像,创建容器并运行容器一把梭哈: docker run -d --restart=always \ --privileged=true \ --net=host \ --name=fastdfs \ -e IP=192.168.149.128 \ -e WEB_PORT=80 \ -v ${HOME}/fastdfs:/var/local/fdfs registry.cn-beijing.aliyuncs.com/tianzuo/fastdfs 其中-v ${HOME}/fastdfs

  • Python collections.deque双边队列原理详解

    队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 在Python文档中搜索队列(queue)会发现,Python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque. collections.deque deque是双端队列(double-ended queue)的缩写,由于两端都能编辑,deque既可以用来实现栈(stack)也可以用来实现队列(queue

随机推荐