std::vector,std::deque,std…

2024-08-31 18:48
文章标签 std vector deque

本文主要是介绍std::vector,std::deque,std…,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址:std::vector,std::deque,std::list的区别的使用 作者:xpddk
vector    表示一段连续的内存区域,每个元素被顺序存储在这段内存中,对vector的随机访问效率很高,但对非末尾元素的插入和删除则效率非常低。

deque    也表示N段连续的内存区域组成,但与vector不同的是它支持高效地在其首部插入和删除元素,它通过两级数组结构来实现,一级表示实际的容器,第二级指向容器的首和尾  

list    表示非连续的内存区域并通过一对指向首尾元素的指针双向链接起来,插入删除效率高,随机访问效率低
      

使用:
它们的使用很相似,
#include <vector>
#include <deque>
#include <list>
下面是一段代码:
std::list<int> a;
a.push_back(5);//从尾部插入数据
a.push_front(7);//从头部插入数据
std::list<int>::iterator p=a.begin();//得到头部数据指针,把iterator 当成指针比较容易理解
*p=10;//修改头部数据
int i=*p;//得到数据
a.pop_front();//释放第一个数据

注意点
1.当执行大数据量的调用push_back()的时候,记住要调用vector::reserve()。
2.如果你计划使用insert(),或者需要pop_front(),那就使用deque。
3.deque是大块大块地分配内存,每次插入固定数量的数据。vector是就近分配内存(这可能不是一个坏的事情)。但我们应该关注是,vector每次增加的内存足够大的时候,在当前的内存不够的情况。deque不需要capacity()和reserve()> 是非常有道理的。
4.*.vector内部分配的内存是永不释放的,即使你调用clear()也不会,这一点很不好,有误导性.有可能一个vector只在瞬间需要很大的容量,但大多数时间只需要很小的容量,结果却是长时间的占用了很大的,没有被使用到的内存.vector也没有提供函数来释放它内部的内存,不过有一个简单的办法,前几天在网上找到的:
      i_math::vector<BYTE>buf;
      buf.resize(100000);//分配了一块至少100000 bytes的内存
      if (TRUE)//清空buf的内存
      {
                  i_math::vector<BYTE> t;
                  buf.swap(t);//把这块内存交换到一个临时的vector里去
      }
      assert(buf.capacity()==0);//内存被清空了
5.*.deque就不一样了,deque永远不会占用太多冗余的内存,你只需要把它resize()到一个你希望的大小,它会自动释放掉那些被多余占用的内存
6.vector还有一个不好的地方,当你往一个vector里添加一个成员的时候,所有指向这个vector的原来成员的指针就不能保证有效了,因为 vector会re-alloc内存.而deque不会,无论从前面还是后面添加新成员,旧的成员都不会移动位置,这一点有时候很有用.


这篇关于std::vector,std::deque,std…的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124713

相关文章

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

C++提高编程三(vector容器、deque容器)

文章目录 vector容器vector赋值操作vector容量和大小vector插入和删除vector数据存取vector互换容器vector预留空间deque容器构造函数deque赋值操作deque大小操作deque 插入和删除deque 数据存取deque 排序 vector容器 vector容器数据结构和数组相似,也称为单端数组。区别在于数组是静态空间,vector可以

STL-vector

string中拷贝构造的现代写法 string(const string& s):_str(nullptr){string tmp(s);swap(_str,tmp._str);} //s1=s3string& operator=(string s){swap(_str,s._str);return *this;} s(由s3调拷贝构造而来)是一个临时对象出了作用域要调析构函数。

容器第二课,List,ArrayList,LinkedList,Vector用法详解

package com.pkushutong.Collection;import java.util.ArrayList;import java.util.Date;import java.util.List;public class Test01 {public static void main(String[] args) {List list = new ArrayList<>();/*

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

【C++学习(28)】通俗一点讲解:std::bind 回调技术

std::bind 是 C++11 标准库中的一个功能,它允许你“绑定”某些参数到一个函数、成员函数或可调用对象上,从而生成一个新的可调用对象。这种新的可调用对象可以稍后被调用,而且其中一些参数已经被预先设置好了。这在回调函数和异步编程中特别有用。 下面我用一个通俗的例子来解释 std::bind 是如何工作的。 假设场景 假设你有一个家庭厨师,他有一个技能叫做“做饭”。做饭需要两个参数:一

【C++】C++ STL探索:Vector使用与背后底层逻辑

C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现 在string类文章中提及了STL容器间的接口是大差不差的,本篇将直接通过模拟实现Vector来讲解底层实现与使用。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔

【C++】vector的简单模拟实现

目录 一、vector的基本实现机制: 二、vector的部分接口模拟实现: 1、构造与析构: 1、普通构造: 2、拷贝构造: 3、析构函数: 2、关于扩容: 1、reserve: 2、resize 3、增删查改: 1、在pos位置插入: 2、[]符号访问修改: 3、删除pos位置的值: 4、重载=运算符: 一、vector的基本实现机制: 如上所

STL—Vector详解

1.vector的介绍和使用  vector实际上是一个类模板,allocator (对象分配的元素的类型) 是第二个模板参数。 2.vector的使用 (1) vector的定义 int TestVector1(){// constructors used in the same order as described above:vector<int> first;