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

目录
  • 一、Vector的基础函数
    • 1. 构造函数
    • 2. 增加元素
    • 3. 删除元素
    • 4. 遍历vector
    • 5. 判断函数
    • 6. 大小函数
    • 7. 其他函数
  • 二、deque的介绍及使用
  • 三、deque 和 vector的差别
    • 1、构造函数
    • 2、常用成员函数
    • 3、特点

一、Vector的基础函数

之前有学习过 vector、set、map等容器,都是需要什么搜什么,没有详细的了解其中的内容。最近在看 STL 的相关内容,就顺手整理一些基础性内容,避免以后遇到的时候再临时抱佛脚。

1. 构造函数

vector<T> v;     //创建一个空的vector
vector<T> v(int nSize, const t& t);     //创建一个vector,元素个数为nSize,元素值均为t
vector<T> v(int nSize);     //创建一个vector,元素个数为nSize
vector<T> v(const vector&);     //复制构造函数
vector<T> v = vector(begin,end);     //复制[begin,end]范围内另一个数组的元素到 v中

2. 增加元素

v.push_back(const T& x);     //在vector尾部增加一个元素x
v.insert(iterator it, const T& x);     //在vector中迭代器指向的元素前插入一个元素x
v.insert(iterator it, int n,const T& x);     //在vector中迭代器指向的元素前插入n个相同的元素x
v.insert(iterator it,const_iterator first,const_iterator last);     //在vector中迭代器指向的元素前插入另一个相同类型vector中[first,last]间的元素

3. 删除元素

v.erase(iterator it);     //删除vector中迭代器指向的元素
v.erase(iterator first, iterator last);     //删除vector中[first,last)的元素
v.pop_back();     //删除vector中的最后一个元素
v.clear();     //清空向量中的所有元素

4. 遍历vector

v.at(int nPos);     //返回nPos位置元素
v.front();     //返回vector的首元素
v.back();     //返回vector的尾元素
v.begin();     //返回指向第一个元素的迭代器
v.end();     //返回指向最后一个元素下一位置的迭代器
v.rbegin();     //反向迭代器,指向最后一个元素
v.rend();     //反向迭代器,指向第一个元素的前一个位置

5. 判断函数

v.empty();     //判断vector是否为空

6. 大小函数

v.size();     //返回vector中元素个数
v.capacity();     //返回当前vector中所能容纳的最大元素个数
v.max_size();     //返回当前vector最大可允许的元素数量个数

7. 其他函数

v.swap(vector& v2);     //交换两个同类型的vector
v.assign(int n,const T& t);     //设置vector中第n个元素的值为t
v.assign(const_iterator first,const_iterator last);     //vector中[first,last)中的元素设置成当前vector元素

二、deque的介绍及使用

deque(double ended queue) 作为双端队列,不论在尾部或头部插入元素,都十分便捷。而在中间插入元素会比较费时,因为必须移动中间其他的元素。

双端队列是一种随机访问的数据类型,提供了在序列两端快速插入和删除的功能,它可以在需要的时候改变自身大小,完成了标准 C++ 数据结构中队列的所有功能。

三、deque 和 vector的差别

deque 则是一种双向开口的连续线性空间,vector是单向开口的连续线性空间。
deque 对象在队列的两端插入和删除元素比较高效,vector 在序列末尾插入和删除元素比较高效。
deque 允许在常数时间内在序列头部进行元素的插入和删除操作,并且 deque 没有所有的 capacity() 观念,它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。vector会因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间,即空间预留机制。
虽然 deque 也提供 Random Access Iterator,但它的迭代器并不是普通的指针,复杂度较高。因此除非必要,应尽可能选择使用 vector 而非 deque。对 deque 的排序操作,可以先完整复制到一个 vector 中,使用 STL 中的排序操作对 vector 排序后,再复制回 deque。

deque 通常由一些独立的区块组成,第一个区块朝某方向扩展,最后一个区块朝另一方向扩展。它允许较为快速地随机访问,但不像 vector 一样把所有对象保存在一个连续的内存块,而是多个连续的内存块,并且在一个映射结构中保存对这些块以及顺序的跟踪。

1、构造函数

#include<deque>
deque<type> deq;            //声明一个元素类型为 type 的双端队列 deq
deque<type> deq(nSize);            //声明含有 nSize 个默认初始化元素的 deq
deque<type> deq(nSize, value)            //声明含有 nSize 个值为 value 的元素的deq
deque<type> deq(MyDeque);            //复制MyDeque到deq
deque<type> deq(first, last);            //使用迭代器first,last范围内的元素初始化deq

2、常用成员函数

deq[nPos];            //访问双向序列中 nPos 位置上的元素
deq.front();            //返回第一个元素
deq.back();            //返回最后一个元素
deq.push_front(x);            //把元素 x 插入到 deq 的头部
deq.pop_front();            //弹出 deq 的第一个元素
deq.push_back(x);            //把元素 x 插入到 deq 的尾部
deq.pop_back();            //弹出 deq 的最后一个元素

3、特点

  • 支持使用 [] 和 at() 进行随机访问,但性能没有 vector 好;
  • 可以在内部进行插入和删除操作,但性能没有 list 好;
  • deque 的元素存取和迭代器操作会稍微较慢,因为内部结构中多一个间接过程;
  • deque 的迭代器是一种特殊的智能指针,能够在不同区块之间跳转;
  • deque 不支持对容量和内存分配时机的控制。
  • deque 的内存重分配优于 vector,因为其内部不需要复制所有元素。
  • deque 的内存块不再被使用时,会被释放。但是该机制由实际操作版本控制是否执行。

到此这篇关于C++ 基础函数的介绍及使用(Vector+deque)的文章就介绍到这了,更多相关C++ deque Vector内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 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++ deque容器的用法详解

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

  • 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++中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++模板以及实现vector实例详解

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

  • 深入分析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++顺序容器(vector、deque、list)的使用详解

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

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

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

  • 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

  • python基础之reverse和reversed函数的介绍及使用

    目录 一.reverse 二.reversed 附:Python中reverse和reversed反转列表的操作方法 总结 一.reverse reverse()是python中列表的一个内置方法(在字典.字符串和元组中没有这个内置方法),用于列表中数据的反转 例子: lista = [1, 2, 3, 4] lista.reverse() print(lista) 打印结果: [4, 3, 2, 1] 其实,lista.reverse()操作的返回值是一个None,其作用的结果需要通过打印被作

  • Linux shell脚本基础学习详细介绍(完整版)第1/2页

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Linux 脚本编写基础 ◆1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序.当编辑好脚本时,如果要执行该脚本,还必须使其可执行.要使脚本可执行:编译

  • Kotlin 基础语法详细介绍

    Kotlin 基础语法详细介绍 基础语法 定义包名 包名的定义应当在源文件的头部 package my.demo import java.util.* // ... 文件路径和包名并不要求匹配,源文件可以被放置在文件系统任意位置 参考:包 定义函数 函数有两个Int类型参数和Int类型返回值: fun sum(a: Int, b: Int): Int { return a + b } 函数体中只有一个表达式并且作为函数的返回值: fun sum(a: Int, b: Int) = a + b 函

  • 一文带你了解Python 四种常见基础爬虫方法介绍

    一.Urllib方法 Urllib是python内置的HTTP请求库 import urllib.request #1.定位抓取的url url='http://www.baidu.com/' #2.向目标url发送请求 response=urllib.request.urlopen(url) #3.读取数据 data=response.read() # print(data) #打印出来的数据有ASCII码 print(data.decode('utf-8')) #decode将相应编码格式的

  • Python之基础函数案例详解

    函数就是把具有独立功能的代码块封装成一个小模块,可以直接调用,从而提高代码的编写效率以及重用性, 需要注意的是, 函数需要被调用才会执行, 而调用函数需要根据函数名调用  函数的定义格式: def 函数名(): 函数代码 使用当前文件的函数 我们直接定义一个函数然后运行程序, 函数并不会被调用 def hello(): print('hello') 想要函数被执行, 需要使用函数名来调用函数 # 定义函数 def hello(): print('hello') # 调用函数 hello()  需

  • C++ 函数的介绍

    目录 一.基础 二.参数 三.返回类型 四.函数重载与解析 五.内联函数 1.constexpr函数 六.函数指针 七.思考 1.我们常常会见到如下代码,是由什么作用? 2.可以用别名定义一个函数类型吗? 一.基础 函数:封装了一段代码,可以在一次执行过程中被反复调用,包含函数头和函数体: 函数头: 函数名称(标识符),用于后续的调用: 形式参数,代表函数的输入参数: 返回类型,函数执行完成后返回结果的类型: 函数体:一个语句块(block),包含具体的计算逻辑: 函数的声明与定义: 函数声明只

  • C++函数模板介绍

    文章转自: 公众号:Coder梁(ID:Coder_LT) 函数模板: 所谓函数的模板,本质上也就是使用泛型来定义函数. 所谓的泛型其实也就是不定的类型,比如说我们使用vector的时候,可以定义各种类型的vector,可以定义存储int型的vector也可以定义存储float类型的,也可以定义存储其他类型.我们在声明的时候将存储的类型当做参数传给了模板. 泛型可以用具体的类型,比如(int或double)替换,通过将类型作为参数传给模板,编译器会根据传递的参数类型生成该类型的函数.这种方式也被

  • EasyC++函数模板介绍

    文章转自: 公众号:Coder梁(ID:Coder_LT) 函数模板: 所谓函数的模板,本质上也就是使用泛型来定义函数. 所谓的泛型其实也就是不定的类型,比如说我们使用vector的时候,可以定义各种类型的vector,可以定义存储int型的vector也可以定义存储float类型的,也可以定义存储其他类型.我们在声明的时候将存储的类型当做参数传给了模板. 泛型可以用具体的类型,比如(int或double)替换,通过将类型作为参数传给模板,编译器会根据传递的参数类型生成该类型的函数.这种方式也被

  • C++ 函数的介绍

    目录 一.基础 二.参数 三.返回类型 四.函数重载与解析 五.内联函数 1.constexpr函数 六.函数指针 七.思考 1.我们常常会见到如下代码,是由什么作用? 2.可以用别名定义一个函数类型吗? 一.基础 函数:封装了一段代码,可以在一次执行过程中被反复调用,包含函数头和函数体: 函数头: 函数名称(标识符),用于后续的调用: 形式参数,代表函数的输入参数: 返回类型,函数执行完成后返回结果的类型: 函数体:一个语句块(block),包含具体的计算逻辑: 函数的声明与定义: 函数声明只

随机推荐