当前位置: 首页 > news >正文

徐州网站建设外包/营销型网站建设应该考虑哪些因素

徐州网站建设外包,营销型网站建设应该考虑哪些因素,石家庄最新,公司网络平台搭建deque 容器 Vector 容器是单向开口的连续内存空间, deque 则是一种双向开口的连续线性空 间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然, vector 容器也可以在头尾两端插入元素,但是在其…

deque 容器

        Vector 容器是单向开口的连续内存空间, deque 则是一种双向开口的连续线性空 间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然, vector 容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。
        Deque 容器和 vector 容器最大的差异,一在于 deque 允许使用常数项时间对头端 进行元素的插入和删除操作。二在于 deque 没有容量的概念,因为它是动态的以 分段连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像 vector 那样, 旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间” 这样的事情在 deque 身上是不会发生的。也因此 deque 没有必须要提供所谓的空间保留(reserve) 功能 .
        虽然 deque 容器也提供了 Random Access Iterator, 但是它的迭代器并不是普通的指针,其复杂度和 vector 不是一个量级,这当然影响各个运算的层面。因此,除非 有必要,我们应该尽可能的使用 vector ,而不是 deque 。对 deque 进行的排序操作,为了最高效率,可将 deque 先完整的复制到一个 vector 中,对 vector 容器进行排序,再复制回 deque.

deque 容器实现原理

        Deque 容器是连续的空间,至少逻辑上看来如此,连续现行空间总是令我们联想 到 array vector,array 无法成长, vector 虽可成长,却只能向尾端成长,而且其 成长其实是一个假象,事实上(1) 申请更大空间 (2) 原数据复制新空间 (3) 释放原空间 三步骤,如果不是 vector 每次配置新的空间时都留有余裕,其成长假象所带来 的代价是非常昂贵的。
        Deque 是由一段一段的定量的连续空间构成。一旦有必要在 deque 前端或者尾端增加新的空间,便配置一段连续定量的空间,串接在 deque 的头端或者尾端。
        Deque 最大的工作就是维护这些分段连续的内存空间的整体性的假象,并提供随 机存取的接口,避开了重新配置空间,复制,释放的轮回,代价就是复杂的迭代器架构。
        既然 deque 是分段连续内存空间,那么就必须有中央控制,维持整体连续的假象, 数据结构的设计及迭代器的前进后退操作颇为繁琐。Deque 代码的实现远比 vector 或 list 都多得多。         Deque 采取一块所谓的 map( 注意,不是 STL map 容器 ) 作为主控,这里所谓map 是一小块连续的内存空间,其中每一个元素 ( 此处成为一个结点 ) 都是一个指针, 指向另一段连续性内存空间,称作缓冲区。缓冲区才是 deque 的存储空间的主体。

deque 构造函数

deque<T> deqT; // 默认构造形式
deque(beg, end); // 构造函数将 [beg, end) 区间中的元素拷贝给本身。
deque(n, elem); // 构造函数将 n elem 拷贝给本身。
deque( const deque &deq); // 拷贝构造函数。

deque 赋值操作

assign(beg, end); // [beg, end) 区间中的数据拷贝赋值给本身。
assign(n, elem); // n elem 拷贝赋值给本身。
deque& operator =( const deque &deq); // 重载等号操作符
swap(deq); // deq 与本身的元素互换

deque 大小操作

deque.size(); // 返回容器中元素的个数
deque.empty(); // 判断容器是否为空
deque.resize(num); // 重新指定容器的长度为 num, 若容器变长,则以默认值填充新位 置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); // 重新指定容器的长度为 num, 若容器变长,则以 elem 填充新位置 , 如果容器变短,则末尾超出容器长度的元素被删除。

deque 双端插入和删除操作

push_back(elem); // 在容器尾部添加一个数据
push_front(elem); // 在容器头部插入一个数据
pop_back(); // 删除容器最后一个数据
pop_front(); // 删除容器第一个数据

deque 数据存取

at(idx); // 返回索引 idx 所指的数据,如果 idx 越界,抛出 out_of_range
operator []; // 返回索引 idx 所指的数据,如果 idx 越界,不抛出异常,直接出错。
front(); // 返回第一个数据。
back(); // 返回最后一个数据

deque 插入操作

insert(pos,elem); // pos 位置插入一个 elem 元素的拷贝,返回新数据的位置。
insert(pos,n,elem); // pos 位置插入 n elem 数据,无返回值。
insert(pos,beg,end); // pos 位置插入 [beg,end) 区间的数据,无返回值。

deque 删除操作

clear(); // 移除容器的所有数据
erase(beg,end); // 删除 [beg,end) 区间的数据,返回下一个数据的位置。
erase(pos); // 删除 pos 位置的数据,返回下一个数据的位置。

stack 容器

容器基本概念

        stack 是一种先进后出 (First In Last Out,FILO) 的数据结构,它只有一个出口,形式 如图所示。stack 容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端 外,没有任何其他方法可以存取 stack 的其他元素。换言之, stack 不允许有遍历 行为。
有元素推入栈的操作称为 :push, 将元素推出 stack 的操作称为 pop

stack 没有迭代器

        Stack 所有元素的进出都必须符合 先进后出 的条件,只有 stack 顶端的元素,才有机会被外界取用。Stack 不提供遍历功能,也不提供迭代器。

stack 构造函数

stack<T> stkT; //stack 采用模板类实现, stack 对象的默认构造形式:
stack( const stack &stk); // 拷贝构造函数

stack 赋值操作

stack& operator =( const stack &stk); // 重载等号操作符

stack 数据存取操作

push(elem); // 向栈顶添加元素
pop(); // 从栈顶移除第一个元素
top(); // 返回栈顶元素

stack 大小操作

empty(); // 判断堆栈是否为空
size(); // 返回堆栈的大小

queue 容器

容器基本概念
        Queue 是一种先进先出 (First In First Out,FIFO) 的数据结构,它有两个出口, queue 容器允许从一端新增元素,从另一端移除元素。
queue 没有迭代器
        Queue 所有元素的进出都必须符合 先进先出 的条件,只有 queue 的顶端元素,才 有机会被外界取用。Queue 不提供遍历功能,也不提供迭代器。

queue 构造函数

queue<T> queT; //queue 采用模板类实现, queue 对象的默认构造形式:
queue( const queue &que); // 拷贝构造函数

queue 存取、插入和删除操作

push(elem); // 往队尾添加元素
pop(); // 从队头移除第一个元素
back(); // 返回最后一个元素
front(); // 返回第一个元素

queue 赋值操作

queue& operator =( const queue &que); // 重载等号操作符

queue 大小操作

empty(); // 判断队列是否为空
size(); // 返回队列的大小

list 容器

list 容器基本概念

        链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通 过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点) 组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素 的数据域,另一个是存储下一个结点地址的指针域。
        相较于 vector 的连续线性空间, list 就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list 对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list 永远是常数时间。
         List 和 vector 是两个最常被使用的容器。
List 容器是一个双向链表。
        采用动态存储分配,不会造成内存浪费和溢出
        链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
        链表灵活,但是空间和时间额外耗费较大
list 容器的迭代器
        List 容器不能像 vector 一样以普通指针作为迭代器,因为其节点不能保证在同一 块连续的内存空间上。List 迭代器必须有能力指向 list 的节点,并有能力进行正确的递增、递减、取值、成员存取操作。所谓”list 正确的递增,递减、取值、成员 取用” 是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点 的数据值,成员取用时取的是节点的成员。
        由于 list 是一个双向链表,迭代器必须能够具备前移、后移的能力,所以 list 容器 提供的是 Bidirectional Iterators.
        List 有一个重要的性质,插入操作和删除操作都不会造成原有 list 迭代器的失效。
        这在 vector 是不成立的,因为 vector 的插入操作可能造成记忆体重新配置,导致 原有的迭代器全部失效,甚至 List 元素的删除,也只有被删除的那个元素的迭代 器失效,其他迭代器不受任何影响。
list 容器的数据结构
list 容器不仅是一个双向链表,而且还是一个循环的双向链表。

list 构造函数

list<T> lstT; //list 采用采用模板类实现 , 对象的默认构造形式:
list(beg,end); // 构造函数将 [beg, end) 区间中的元素拷贝给本身。
list(n,elem); // 构造函数将 n elem 拷贝给本身。
list( const list &lst); // 拷贝构造函数。

list 数据元素插入和删除操作

push_back(elem); // 在容器尾部加入一个元素
pop_back(); // 删除容器中最后一个元素
push_front(elem); // 在容器开头插入一个元素
pop_front(); // 从容器开头移除第一个元素
insert(pos,elem); // pos 位置插 elem 元素的拷贝,返回新数据的位置。
insert(pos,n,elem); // pos 位置插入 n elem 数据,无返回值。
insert(pos,beg,end); // pos 位置插入 [beg,end) 区间的数据,无返回值。
clear(); // 移除容器的所有数据
erase(beg,end); // 删除 [beg,end) 区间的数据,返回下一个数据的位置。
erase(pos); // 删除 pos 位置的数据,返回下一个数据的位置。
remove(elem); // 删除容器中所有与 elem 值匹配的元素。

list 大小操作

size(); // 返回容器中元素的个数
empty(); // 判断容器是否为空
resize(num); // 重新指定容器的长度为 num
若容器变长,则以默认值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem); // 重新指定容器的长度为 num
若容器变长,则以 elem 值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。

list 赋值操作

assign(beg, end); // [beg, end) 区间中的数据拷贝赋值给本身。
assign(n, elem); // n elem 拷贝赋值给本身。
list& operator =( const list &lst); // 重载等号操作符
swap(lst); // lst 与本身的元素互换。
3.6.4.5 list 数据的存取
front(); // 返回第一个元素。
back(); // 返回最后一个元素。
3.6 .4 .6 list 反转排序
reverse(); // 反转链表,比如 lst 包含 1,3,5 元素,运行此方法后, lst 就包含 5,3,1 元素。
sort(); //list 排序

list 反转排序

reverse(); // 反转链表,比如 lst 包含 1,3,5 元素,运行此方法后, lst 就包含 5,3,1 元素。
sort(); //list 排序

set/multiset 容器

set/multiset 容器基本概念

        Set 的特性是。所有元素都会根据元素的键值自动被排序。 Set 的元素不像 map 那样可以同时拥有实值和键值,set 的元素即是键值又是实值。 Set 不允许两个元素 有相同的键值。
        我们可以通过 set 的迭代器改变 set 元素的值吗?不行,因为 set 元素值就是其键 值,关系到 set 元素的排序规则。如果任意改变 set 元素值,会严重破坏 set 组织。 换句话说,set iterator 是一种 const_iterator.
        set 拥有和 list 某些相同的性质,当对容器中的元素进行插入操作或者删除操作的 时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。
        multiset 特性及用法和 set 完全相同,唯一的差别在于它允许键值重复。 set 和 multiset 的底层实现是红黑树,红黑树为平衡二叉树的一种。
树的简单知识:
二叉树就是任何节点最多只允许有两个字节点。分别是左子结点和右子节点。
二叉树示意图
        二叉搜索树,是指二叉树中的节点按照一定的规则进行排序,使得对二叉树中元素 访问更加高效。二叉搜索树的放置规则是:任何节点的元素值一定大于其左子树中 的每一个节点的元素值,并且小于其右子树的值。因此从根节点一直向左走,一直 到无路可走,即得到最小值,一直向右走,直至无路可走,可得到最大值。那么在 儿茶搜索树中找到最大元素和最小元素是非常简单的事情。下图为二叉搜索树:
        上面我们介绍了二叉搜索树,那么当一个二叉搜索树的左子树和右子树不平衡的时候,那么搜索依据上图表示,搜索 9 所花费的时间要比搜索 17 所花费的时间要多, 由于我们的输入或者经过我们插入或者删除操作,二叉树失去平衡,造成搜索效率降低。
        所以我们有了一个平衡二叉树的概念,所谓的平衡不是指的完全平衡。

set 构造函数

set<T> st; //set 默认构造函数:
mulitset<T> mst; //multiset 默认构造函数 :
set( const set &st); // 拷贝构造函数

set 赋值操作

set& operator =( const set &st); // 重载等号操作符
swap(st); // 交换两个集合容器

set 大小操作

size(); // 返回容器中元素的数目
empty(); // 判断容器是否为空

set 插入和删除操作

insert(elem); // 在容器中插入元素。
clear(); // 清除所有元素
erase(pos); // 删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); // 删除区间 [beg,end) 的所有元素 ,返回下一个元素的迭代器。
erase(elem); // 删除容器中值为 elem 的元素。

set 查找操作

find(key); // 查找键 key 是否存在 , 若存在,返回该键的元素的迭代器;若不存在,返 set.end();
count(key); // 查找键 key 的元素个数
lower_bound(keyElem); // 返回第一个 key>=keyElem 元素的迭代器。
upper_bound(keyElem); // 返回第一个 key>keyElem 元素的迭代器。
equal_range(keyElem); // 返回容器中 key keyElem 相等的上下限的两个迭代器。

set 的返回值 指定 set 排序规则:

// 插入操作返回值
// 插入操作返回值
void test01(){
        set< int > s;
        pair<set< int >::iterator, bool > ret = s.insert( 10 );
        if (ret.second){
                cout << " 插入成功 :" << *ret.first << endl;
        }
        else {
                cout << " 插入失败 :" << *ret.first << endl;
        }
        ret = s.insert( 10 );
        if (ret.second){
                cout << " 插入成功 :" << *ret.first << endl;
        }
        else {
                cout << " 插入失败 :" << *ret.first << endl;
        }
}
struct MyCompare02{
        bool operator ()( int v1, int v2){
                return v1 > v2;
        }
};
//set 从大到小
void test02(){
        srand(( unsigned int )time(NULL));
        //我们发现 set 容器的第二个模板参数可以设置排序规则,默认规则是 less<_Kt y>
        set< int , MyCompare02> s;
        for ( int i = 0 ; i < 10 ;i++){
                s.insert(rand() % 100 );
        }
        for (set< int , MyCompare02>::iterator it = s.begin(); it != s.end (); it ++){
                cout << *it << " " ;
        }
        cout << endl;
}
//set 容器中存放对象
class Person{
public :
        Person(string name, int age){
                this ->mName = name;
                this ->mAge = age;
        }
public :
        string mName;
        int mAge;
};
struct MyCompare03{
        bool operator ()( const Person& p1, const Person& p2){
                return p1.mAge > p2.mAge;
        }
};
void test03(){
        set<Person, MyCompare03> s;
        Person p1( "aaa" , 20 );
        Person p2( "bbb" , 30 );
        Person p3( "ccc" , 40 );
        Person p4( "ddd" , 50 );
        s.insert(p1);
        s.insert(p2);
        s.insert(p3);
        s.insert(p4);
        for (set<Person, MyCompare03>::iterator it = s.begin(); it != s.end(); it++){
                cout << "Name:" << it->mName << " Age:" << it->mAge << endl;
        }
}

对组(pair)

        对组(pair) 将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可 以分别用 pair 的两个公有属性 first second 访问。
类模板: template <class T1, class T2> struct pair.
如何创建对组 ?
// 第一种方法创建一个对组
pair<string, int > pair1(string( "name" ), 20 );
cout << pair1.first << endl; // 访问 pair 第一个值
cout << pair1.second << endl; // 访问 pair 第二个值
// 第二种
pair<string, int > pair2 = make_pair( "name" , 30 );
cout << pair2.first << endl;
cout << pair2.second << endl;
//pair= 赋值
pair<string, int > pair3 = pair2;
cout << pair3.first << endl;
cout << pair3.second << endl;

map/multimap 容器

map/multimap 基本概念

        Map 的特性是,所有元素都会根据元素的键值自动排序。 Map 所有的元素都是 pair,同时拥有实值和键值, pair 的第一元素被视为键值,第二元素被视为实值, map 不允许两个元素有相同的键值。
        我们可以通过 map 的迭代器改变 map 的键值吗?答案是不行,因为 map 的键值 关系到 map 元素的排列规则,任意改变 map 键值将会严重破坏 map 组织。如果 想要修改元素的实值,那么是可以的。
        Map 和 list 拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作 时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。
        Multimap 和 map 的操作类似,唯一区别 multimap 键值可重复。
        Map 和 multimap 都是以红黑树为底层实现机制。

map 构造函数

map<T1, T2> mapTT; //map 默认构造函数 :
map( const map &mp); // 拷贝构造函数

map 赋值操作

map& operator =( const map &mp); // 重载等号操作符
swap(mp); // 交换两个集合容器

map 大小操作

size(); // 返回容器中元素的数目
empty(); // 判断容器是否为空

map 插入数据元素操作

map.insert(...); // 往容器插入元素,返回 pair<iterator,bool>
map< int , string> mapStu;
// 第一种 通过 pair 的方式插入对象
mapStu.insert(pair< int , string>( 3 , " 小张 " ));
// 第二种 通过 pair 的方式插入对象
mapStu.inset(make_pair(- 1 , " 校长 " ));
// 第三种 通过 value_type 的方式插入对象
mapStu.insert(map< int , string>:: value_type ( 1 , " 小李 " ));
// 第四种 通过数组的方式插入值
mapStu[ 3 ] = " 小刘 " ;
mapStu[ 5 ] = " 小王 " ;

map 删除操作

clear(); // 删除所有元素
erase(pos); // 删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end); // 删除区间 [beg,end) 的所有元素 ,返回下一个元素的迭代器。
erase(keyElem); // 删除容器中 key keyElem 的对组。

map 查找操作

find(key); // 查找键 key 是否存在 , 若存在,返回该键的元素的迭代器; / 若不存在,返 map.end();
count(keyElem); // 返回容器中 key keyElem 的对组个数。对 map 来说,要么是 0 要么是 1 。对 multimap 来说,值可能大于 1
lower_bound(keyElem); // 返回第一个 key>=keyElem 元素的迭代器。
upper_bound(keyElem); // 返回第一个 key>keyElem 元素的迭代器。
equal_range(keyElem); // 返回容器中 key keyElem 相等的上下限的两个迭代器。

multimap 案例

        公司今天招聘了 5 个员工, 5 名员工进入公司之后,需要指派员工在那个部门工作 人员信息有: 姓名 年龄 电话 工资等组成 通过 Multimap 进行信息的插入 保存 显示 分部门显示员工信息 显示全部员工信息
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
// multimap 案例
// 公司今天招聘了 5 个员工,5 名员工进入公司之后,需要指派员工在那个部门工作
// 人员信息有: 姓名 年龄 电话 工资等组成
// 通过 Multimap 进行信息的插入 保存 显示
// 分部门显示员工信息 显示全部员工信息
#define SALE_DEPATMENT 1     // 销售部门
#define DEVELOP_DEPATMENT 2  // 研发部门
#define FINACIAL_DEPATMENT 3 // 财务部门
#define ALL_DEPATMENT 4      // 所有部门
// 员工类
class person
{
public:string name;   // 员工姓名int age;       // 员工年龄double salary; // 员工工资string tele;   // 员工电话
};
// 创建 5 个员工
void CreatePerson(vector<person> &vlist)
{string seed = "ABCDE";for (int i = 0; i < 5; i++){person p;p.name = "员工";p.name += seed[i];p.age = rand() % 30 + 20;p.salary = rand() % 20000 + 10000;p.tele = "010-8888888";vlist.push_back(p);}
}
// 5 名员工分配到不同的部门
void PersonByGroup(vector<person> &vlist, multimap<int, person> &plist)
{int operate = -1; // 用户的操作for (vector<person>::iterator it = vlist.begin(); it != vlist.end(); it++){cout << "当前员工信息:" << endl;
cout << "姓名:" << it->name << " 年龄:" << it->age << " 工
资:" << it->salary << " 电话:" << it->tele << endl;
cout << "请对该员工进行部门分配(1 销售部门, 2 研发部门, 3 财务
部门):" << endl;
scanf("%d", &operate);
while (true)
{if (operate == SALE_DEPATMENT){ // 将该员工加入到销售部门plist.insert(make_pair(SALE_DEPATMENT, *it));break;}else if (operate == DEVELOP_DEPATMENT){plist.insert(make_pair(DEVELOP_DEPATMENT, *it));break;}else if (operate == FINACIAL_DEPATMENT){plist.insert(make_pair(FINACIAL_DEPATMENT, *it));break;}else{
cout << "您的输入有误,请重新输入(1 销售部门, 2 研
发部门, 3 财务部门):" << endl;
scanf("%d", &operate);}
}}cout << "员工部门分配完毕!" << endl;cout << "********************************************************* **" << endl;
}
// 打印员工信息
void printList(multimap<int, person> &plist, int myoperate)
{if (myoperate == ALL_DEPATMENT){for (multimap<int, person>::iterator it = plist.begin(); it != plist.end(); it++){cout << "姓名:" << it->second.name << " 年龄:" << it->second.age << " 工资:" << it->second.salary << " 电话:" << it->second.t ele << endl;}return;}multimap<int, person>::iterator it = plist.find(myoperate);int depatCount = plist.count(myoperate);int num = 0;if (it != plist.end()){while (it != plist.end() && num < depatCount){cout << "姓名:" << it->second.name << " 年龄:" << it->second.age << " 工资:" << it->second.salary << " 电话:" << it->second.t ele << endl;it++;num++;}}
}
// 根据用户操作显示不同部门的人员列表
void ShowPersonList(multimap<int, person> &plist, int myoperate)
{switch (myoperate){case SALE_DEPATMENT:printList(plist, SALE_DEPATMENT);break;case DEVELOP_DEPATMENT:printList(plist, DEVELOP_DEPATMENT);break;case FINACIAL_DEPATMENT:printList(plist, FINACIAL_DEPATMENT);break;case ALL_DEPATMENT:printList(plist, ALL_DEPATMENT);break;}
}
// 用户操作菜单
void PersonMenue(multimap<int, person> &plist)
{int flag = -1;int isexit = 0;while (true){
cout << "请输入您的操作((1 销售部门, 2 研发部门, 3 财务部门, 4
所有部门, 0 退出):" << endl;
scanf("%d", &flag);
switch (flag)
{
case SALE_DEPATMENT:ShowPersonList(plist, SALE_DEPATMENT);break;
case DEVELOP_DEPATMENT:ShowPersonList(plist, DEVELOP_DEPATMENT);break;
case FINACIAL_DEPATMENT:ShowPersonList(plist, FINACIAL_DEPATMENT);break;
case ALL_DEPATMENT:ShowPersonList(plist, ALL_DEPATMENT);break;
case 0:isexit = 1;break;
default:cout << "您的输入有误,请重新输入!" << endl;break;
}
if (isexit == 1)
{break;
}}
}
int main()
{vector<person> vlist;        // 创建的 5 个员工 未分组multimap<int, person> plist; // 保存分组后员工信息// 创建 5 个员工CreatePerson(vlist);// 5 名员工分配到不同的部门PersonByGroup(vlist, plist);// 根据用户输入显示不同部门员工信息列表 或者 显示全部员工的信息列表PersonMenue(plist);system("pause");return EXIT_SUCCESS;
}

STL 容器使用时机

        比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描述。
deque 的使用场景:比如排队购票系统,对排队者的存储可以采用 deque ,支持 头端的快速移除,尾端的快速添加。如果采用 vector ,则头端移除时,会移动大量 的数据,速度慢。
        vector 与 deque 的比较:
        一:vector.at() deque.at() 效率高,比如 vector.at(0) 是固定的, deque 的开始位 置 却是不固定的。
        二:如果有大量释放操作的话,vector 花的时间更少,这跟二者的内部实现有关。
        三:deque 支持头部的快速插入与快速移除,这是 deque 的优点。
list 的使用场景:比如公交车乘客的存储,随时可能有乘客下车,支持频繁的不确实位置元素的移除插入。
set 的使用场景:比如对手机游戏的个人得分记录的存储,存储要求从高分到低分 的顺序排列。
map 的使用场景:比如按 ID 号存储十万个用户,想要快速要通过 ID 查找对应的 用户。二叉树的查找效率,这时就体现出来了。如果是 vector 容器,最坏的情况 下可能要遍历完整个容器才能找到该用户。

相关文章:

C++STL库的 deque、stack、queue、list、set/multiset、map/multimap

deque 容器 Vector 容器是单向开口的连续内存空间&#xff0c; deque 则是一种双向开口的连续线性空 间。所谓的双向开口&#xff0c;意思是可以在头尾两端分别做元素的插入和删除操作&#xff0c;当然&#xff0c; vector 容器也可以在头尾两端插入元素&#xff0c;但是在其…...

Vuex快速上手

一、Vuex 概述 目标&#xff1a;明确Vuex是什么&#xff0c;应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如&#xff1a;购…...

计网 - LVS 是如何直接基于 IP 层进行负载平衡调度

文章目录 模型LVS的工作机制初探LVS的负载均衡机制初探 模型 大致来说&#xff0c;可以这么理解&#xff08;只是帮助我们理解&#xff0c;实际上肯定会有点出入&#xff09;&#xff0c;对于我们的 PC 机来说&#xff0c;物理层可以看成网卡&#xff0c;数据链路层可以看成网卡…...

GEE机器学习——利用支持向量机SVM进行土地分类和精度评定

支持向量机方法 支持向量机(Support Vector Machine,SVM)是一种常用的机器学习算法,主要用于分类和回归问题。SVM的目标是找到一个最优的超平面,将不同类别的样本点分隔开来,使得两个类别的间隔最大化。具体来说,SVM通过寻找支持向量(即距离超平面最近的样本点),确定…...

【ARM Trace32(劳特巴赫) 使用介绍 13 -- Trace32 断点 Break 命令篇】

文章目录 1. Break.Set1.1 TRACE32 Break1.1.1 Break命令控制CPU的暂停1.2 Break.Set 设置断点1.2.1 Trace32 程序断点1.2.2 读写断点1.2.2.1 变量被改写为特定值触发halt1.2.2.2 设定非值触发halt1.2.2.4 变量被特定函数改写触发halt1.2.3 使用C/C++语法设置断点条件1.2.4 使用…...

【JVM入门到实战】(三) 查看字节码文件的工具

一、 javap -v命令 javap是JDK自带的反编译工具&#xff0c;可以通过控制台查看字节码文件的内容。适合在服务器上查看字节码文件内容。直接输入javap查看所有参数。输入javap -v 字节码文件名称 查看具体的字节码信息。&#xff08;如果jar包需要先使用 jar –xvf 命令解压&a…...

9:00面试,9:05就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…...

无需重启,修改Linux服务器时区

Linux修改服务器时区&#xff08;无需重启&#xff09; 1、复制命令&#xff1a;2、使用tzselect命令&#xff1a;3、使用date查看是否修改正确 1、复制命令&#xff1a; cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime2、使用tzselect命令&#xff1a; tzselect按照要…...

【Android嵌入式开发及实训课程实验】【项目1】 图形界面——计算器项目

【项目1】 图形界面——计算器项目 需求分析界面设计实施1、创建项目2、 界面实现实现代码1.activity_main.xml2.Java代码 - MainActivity.java 3、运行测试 注意点结束~ 需求分析 开发一个简单的计算器项目&#xff0c;该程序只能进行加减乘除运算。要求界面美观&#xff0c;…...

利用SPSS进行神经网络分析过程及结果解读

模拟人类实际神经网络的数学方法问世以来&#xff0c;人们已慢慢习惯了把这种人工神经网络直接称为 神经网络。 神经网络在系统辨识、模式识别、智能控制等领域有着广泛而吸引人的前景&#xff0c;特别在智能控制中&#xff0c;人们对神经网络的自学习功能尤其感兴趣&#xff0…...

聚观早报 |东方甄选将上架文旅产品;IBM首台模块化量子计算机

【聚观365】12月6日消息 东方甄选将上架文旅产品 IBM首台模块化量子计算机 新思科技携手三星上新兴领域 英伟达与软银推动人工智能研发 苹果对Vision Pro供应商做出调整 东方甄选将上架文旅产品 东方甄选宣布12月10日将在东方甄选APP上线文旅产品&#xff0c;受这一消息影…...

web服务器之——www服务器的基本配置

目录 一、www简介 1、什么是www 2、www所用的协议 3、WEB服务器 4、主要数据 5、浏览器 二、 网址及HTTP简介 1、HTTP协议请求的工作流程 三、www服务器的类型(静态网站&#xff08;HTML&#xff09;&#xff0c; 动态网站(jsp python,php,perl)) 1、 仅提供…...

微信小程序 -- ios 底部小黑条样式问题

问题&#xff1a; 如图&#xff0c;ios有的机型底部伪home键会显示在按钮之上&#xff0c;导致点击按钮的时候误触 解决&#xff1a; App.vue <script>export default {wx.getSystemInfo({success: res > {let bottomHeight res.screenHeight - res.safeArea.bott…...

白盒测试:探索软件内部结构的有效方法

引言&#xff1a; 在软件开发过程中&#xff0c;测试是确保软件质量的关键环节。传统的黑盒测试方法主要关注软件的功能和外部行为&#xff0c;而忽略了软件的内部结构和实现细节。然而&#xff0c;随着软件复杂性的增加&#xff0c;仅仅依靠黑盒测试已经无法满足项目的需求。因…...

图论-并查集

并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图,求最小生成树Kruskal算法和最近公共祖先(LCA)等. 并查集的基本操作主要有: .1.初始化 2.查询find 3.合并union 一般我们都会采用路径压缩 这样…...

redis-学习笔记(Jedis 通用命令)

flushAll 清空全部的数据库数据 jedis.flushAll();set & get set 命令 get 命令 运行结果展示 exists 判断该 key 值是否存在 当 redis 中存在该键值对时, 返回 true 如果键值对不存在, 返回 false keys 获取所有的 key 值 参数是模式匹配 *代表匹配任意个字符 _代表匹配一…...

C语言:高精度乘法

P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 第一次画图&#xff0c;略显简陋。 由图可以看出c的小标与x,y下标的关系为x的下标加上y的下标再减一。 由此得到&#xff1a; c [ i j - 1 ] x [ i ] * y [ j ]x #include<stdio.h> #include<st…...

UE4 Niagara学习笔记

需要在其他发射器的同一个粒子位置发射其他粒子就用Spawn Particles from other Emitter 把发射器名字填上去即可 这里Move to Nearest Distance Field Subface GPU&#xff0c;可以将生成的Niagara附着到最近的物体上 使用场景就是做的火苗附着到物体上...

多维时序 | Matlab实现GA-LSTM-Attention遗传算法优化长短期记忆神经网络融合注意力机制多变量时间序列预测

多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实…...

LeetCode205. Isomorphic Strings

文章目录 一、题目二、题解 一、题目 Given two strings s and t, determine if they are isomorphic. Two strings s and t are isomorphic if the characters in s can be replaced to get t. All occurrences of a character must be replaced with another character wh…...

Event Driven设计模式

EDA&#xff08;Event-Driven Architecture&#xff09;是一种实现组件之间松耦合、易扩展的架构方式。一个最简单的EDA设计需要包含如下几个组件&#xff1a; Events&#xff1a;需要被处理的数据。一个Event至少包含两个属性&#xff0c;类型和数据&#xff0c;类型决定了Eve…...

PostgreSql 设置自增字段

一、概述 序列类型是 PostgreSQL 特有的创建一个自增列的方法。包含 smallserial、serial和 bigserial 类型&#xff0c;它们不是真正的类型&#xff0c;只是为了创建唯一标识符列而存在的方便符号。其本质也是调用的序列&#xff0c;序列详情可参考&#xff1a;《PostgreSql 序…...

什么是泊松图像混合

泊松图像混合&#xff08;Poisson Image Editing&#xff09;的原理基于泊松方程。该方法旨在保持图像中的梯度一致性&#xff0c;从而在图像编辑中实现平滑和无缝的混合。以下是泊松图像混合的基本原理和公式&#xff1a; 泊松方程 泊松方程是一个偏微分方程&#xff0c;通常…...

OpenAI 承认 ChatGPT 最近确实变懒,承诺修复问题

文章目录 一. ChatGPT 指令遵循能力下降引发用户投诉1.1 用户抱怨回应速度慢、敷衍回答、拒绝回答和中断会话 二. OpenAI 官方确认 ChatGPT 存在问题&#xff0c;展开调查三. OpenAI 解释模型行为差异&#xff0c;回应用户质疑四. GPT-4 模型变更受人事动荡和延期影响 一. Chat…...

创作活动(四十九)———低代码:美味膳食或垃圾食品?

#低代码&#xff1a;美味膳食或垃圾食品&#xff1f;# 一、什么是低代码 低代码是一种开发方法&#xff0c;通过可视化界面和少量的编码&#xff0c;使开发者能够快速构建应用程序。它的目标是提高开发效率、降低开发成本&#xff0c;并支持快速迭代和敏捷开发。 二、低代码的…...

【DL-TensorFlow遇错】TensorFlow中遇错合集

TensorFlow中遇错合集 一、AttributeError: module tensorflow has no attribute placeholder二、RuntimeError: tf.placeholder() is not compatible with eager execution. 一、AttributeError: module tensorflow has no attribute placeholder 错误原因 tensorflow版本问…...

pymysql代替mysqlclient,解决mysqlclient因版本不兼容无法安装成功而无法连接mysql的问题

pymysql代替mysqlclient&#xff0c;解决mysqlclient因版本不兼容无法安装成功而无法连接mysql的问题 原因&#xff1a;版本或者环境兼容问题&#xff0c;导致如centos或者其他Linux无法安装mysqlclient模块 解决办法&#xff1a;安装pymysql作为替代 在Django中连接MySQL数…...

uni-app 设置当前page界面进入直接变为横屏模式

首先 我们打开项目的 manifest.json 在左侧导航栏中找到 源码视图 然后找到 app-plus 配置 在下面加上 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏…...

Mysql的多表联合查询

内连接 隐式内连接 select column from tb1,tb2 where 条件; 显示内连接 关键字&#xff1a;[inner] join on 显示内连接与外连接的不同是新增的关键字&#xff0c;inner join 以及 使用on 替换了where select column from tb1 [inner] join tb2 on 条件; 外连接 左外…...

Linux上使用Python的requests库进行HTTP请求

在Linux上使用Python的requests库进行HTTP请求是一种非常方便和高效的方式。requests库是一个第三方库&#xff0c;用于发送HTTP请求并获取响应。下面是一个简单的示例&#xff0c;演示如何使用requests库发送GET请求并获取响应。 首先&#xff0c;你需要安装requests库。你可…...