首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++100问】深度总结STL基本容器的使用

失效的指针、引用或迭代器不再表示任何元素,使用它们是一种严重的程序设计错误。...从容器中删除元素后,指向被删除元素的迭代器、指针和引用失效: 如果容器是 list 或 forward_list 类型,指向容器其他位置的迭代器、指针和引用仍然有效。...如果容器是 deque 类型,删除除首尾之外的任何元素都会使迭代器、指针和引用失效。如果删除尾元素,则尾后迭代器失效,其他迭代器、指针和引用不受影响。如果删除首元素,这些也不会受影响。...设计目的是令容器任何位置的添加和删除操作都很快速,作为代价不支持元素的随机访问——为了访问一个元素,只能遍历整个容器。 优缺点: 优点:内存不连续,动态操作,可在任意位置插入或删除且效率高。...如果程序需要在容器头尾位置插入/删除元素,但不会在中间位置操作,则应该使用 deque。 如果程序只有在读取输入时才需要在容器中间位置插入元素,之后需要随机访问元素。

1.2K31

学会这14种模式,你可以轻松回答任何编码面试问题

在排序数组或链表中搜索对时,两个指针通常很有用;例如,当你必须将数组的每个元素与其他元素进行比较时。 需要两个指针,因为仅使用指针,你将不得不不断地循环遍历数组以找到答案。...确定何时使用"两指针"方法的方法: 在处理排序数组(或链接列表)并且需要找到一组满足某些约束的元素时,它将遇到一些问题。...如何确定何时使用快速和慢速模式? 该问题将处理链表或数组中的循环 当你需要知道某个元素的位置或链表的总长度时。 什么时候应该在上面提到的"两指针"方法上使用它?...使用这种方法可以有效地解决涉及逐级遍历树的任何问题。 Tree BFS模式的工作原理是将根节点推送到队列,然后不断迭代直到队列为空。对于每次迭代,我们都删除队列开头的节点,然后"访问"该节点。...在任何时候,都可以从两个堆的顶部元素计算当前数字列表的中位数。

2.9K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【初阶数据结构篇】链表与顺序表的智慧碰撞:算法难题中的进阶之路

    顺序表算法题 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 点赞、收藏与分享:觉得这篇文章对你有帮助吗?...不熟悉顺序表的可以先了解一下 顺序表实现方法 移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。...删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。...当然可以直接把第二个数组移到第一个数组尾部,然后进行排序 使用qsort函数 int cmp(int* a, int* b) { return *a - *b; } void merge(int...,利用两个数组都是非递减排列 因为排序好的数组仍然是非递减序列,所以我们的两个指针依次从尾部开始向前遍历,谁大把谁放到nums1的尾部(若从前面开始需要新创建一个数组来存储元素最后再赋值给nums1)

    8010

    数据结构从入门到精通——链表

    此外,链表还可以用于实现动态数组,支持元素的动态插入和删除。 总之,链表作为一种重要的数据结构,在编程和数据处理中发挥着重要作用。...证明 给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中的任何结点或空结点。 要求返回这个链表的深度拷贝 其他 。...在链表中查找元素,不同于在数组中的直接索引访问,它通常需要从链表的头部或尾部开始,逐个节点地遍历,直到找到目标元素或者遍历完整个链表。这种查找方式的时间复杂度通常是O(n),其中n是链表的长度。...链表作为一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。这种结构允许我们在不移动其他元素的情况下插入或删除元素,因此在许多场景中都非常有用。...它允许我们在任意节点向前或向后移动,从而方便地访问链表中的任何元素。然而,就像所有资源一样,当我们不再需要双向循环链表时,必须妥善地销毁它,以防止内存泄漏和其他潜在问题。

    48311

    顺序表和链表【数据结构】【基于C语言实现】【一站式速通】

    顺序表的优点 1.支持随机访问:由于顺序表在内存中是连续存储的,因此可以通过下标直接访问任何一个元素。这使得顺序表具有高效的随机访问能力,时间复杂度为O(1)。...按需申请空间,不用了就释放空间(更加合理的使用了空间) 头部中间插入删除数据,不需要挪动数据。...在插入或删除节点时,只需要调整指针的指向,而不需要移动其他节点。这使得链表适用于频繁进行插入和删除操作的场景。 2.灵活性:相比于顺序表,链表的结构更加灵活。...这种设计使得双向链表具有以下优点: 1.可以双向遍历:由于每个节点都有前继节点和后继节点的指针,因此可以从任意一个节点开始,顺着前继节点或后继节点进行遍历。...2.方便进行插入和删除操作:在双向链表中插入或删除节点时,只需要修改相邻节点的指针即可,不需要像单向链表那样找到前一个节点来修改指针。这使得双向链表在插入和删除操作方面更加方便。

    11610

    文心一言 VS 讯飞星火 VS chatgpt (119)-- 算法导论10.3 4题

    假设除指向链表本身的指针外没有其他指针指向该链表的元素,试说明如何实现过程ALLOCATE-OBIECT和 FREE-OBJECT,使得该表示保持紧凑。(提示:使用栈的数组实现。)...否则,我们从栈顶弹出一个节点并将其数据设置为所需的值。在FREE-OBJECT过程中,我们将节点推入栈中以使其可供以后重新使用。...然后,可以创建一个栈来存储链表的元素。每当新的元素被添加到链表中时,将其压入栈中。当需要删除链表中的某个元素时,将其从栈中弹出。在遍历链表时,可以使用栈的出栈操作来访问链表中的元素。...首先,我们需要找到这个节点,然后将其从栈中删除。如果这个节点没有前驱节点,我们就将栈顶节点的前驱指针设置为nil。如果这个节点没有后继节点,我们就将栈顶节点的后继指针设置为nil。...通过ALLOCATE_OBJECT方法可以分配新节点,FREE_OBJECT方法可以释放节点。该实现将所有元素存储在紧凑的连续内存中,并使用栈来管理空闲节点。

    28240

    深入理解栈和队列(二):队列

    出队(Dequeue):从队头删除并返回一个元素。 查看队头元素(Front):返回队头元素,但不删除它。 查看队尾元素(Rear):返回队尾元素,但不删除它。...清空队列(Clear):删除队列中的所有元素。 三、队列的实现 1. 实现方法的选择 队列可以使用多种数据结构来实现,如数组、链表等。...但是用链表实现队列效果更优,因为如果是数组的话,队列每次需要从头上出数据,这样就需要将数组后面的数据依次往前挪动,这样会增加时间复杂度,不如使用链表直接free掉队头数据快捷。 2....即使 cur 已经是 NULL,队列的其他成员变量(如 size)仍然可能包含不正确的值。通过将头指针和尾指针都设置为 NULL,可以确保队列被完全清空,并避免任何潜在的错误或未初始化的状态。...缓冲区:在输入输出操作中,队列可以用作缓冲区,暂存输入数据或输出数据。 优先队列:优先队列是一种特殊的队列,其中元素按照某种优先级排序。在搜索引擎中,优先队列可以用于对搜索结果进行排序。

    11110

    《C++Primer》第十三章 拷贝控制

    编译器从给定对象中依次将每个非static成员拷贝到正在创建的对象中。 每个成员的类型决定了它如何拷贝:对于类类型的成员会使用其拷贝构造函数来拷贝;内置类型的成员则直接拷贝。...虽然我们不能直接拷贝一个数组,但是合成拷贝构造函数会将逐个元素地拷贝一个数组类型的成员。当然如果数组成员是类类型,则使用元素的拷贝构造函数来拷贝。...无论何时一个对象被销毁,就会自动调用其析构函数: 变量离开其作用域时被销毁 当一个对象被销毁时,其成员被销毁 容器(无论是标准库容器还是数组)被销毁时,其元素被销毁 对于动态分配的对象,当对指向它的指针使用...定义行为像指针的类 令一个类实现类似指针的行为最好方法是使用shared_ptr来管理类中的资源你,拷贝/赋值一个shared_ptr会拷贝/赋值shared_ptr所指向的指针。...; // 指向数据首元素的指针 std::string *first_free; // 指向数组第一个空闲元素的指针 std::string *cap; // 指向数据尾后位置的指针

    1.6K40

    《逆袭进大厂》第四弹之C++重头戏STL30问30答

    连续存储结构:vector是可以实现动态增长的对象数组,支持对数组高效率的访问和在数组尾端的删除和插入操作,在中间和头部删除和插入相对不易,需要挪动大量的数据。...这和C++中的智能指针很像,智能指针也是将一个指针封装,然后通过引用计数或是其他方法完成自动释放内存的功能。...2) 假设进程A在共享内存中放入了数个容器,进程B如何找到这些容器呢? 一个方法就是进程A把容器放在共享内存中的确定地址上(fixed offsets),则进程B可以从该已知地址上获取容器。...对任何位置元素的插入和删除都是常数时间。...,没有其他方法可以获取到内部的其他元素,其结构图如下: ?

    1.5K20

    【数据结构】顺序表和链表详解&&顺序表和链表的实现

    ,在数组上完成数据的增删查改 顺序表一般可以分为: 1.1.2 静态顺序表 静态顺序表:使用定长数组存储元素 1.1.3 动态顺序表 动态顺序表:使用动态开辟的数组存储 1.2 链表 1.2.1...; i++) { if (ps->a[i] == x) { return i; } } return -1; } 3.单链表的实现 顺序表存在下面的问题: 尾插效率还不错,头插或中间插入删除...5.数组下标为什么从0开始 我们在学习数组时会有这个疑问: 数组元素的下标为什么从0开始而不从1开始呢?...从1开始更符合我们的日常习惯,比如生活中我们通常说第1个,而不是第0个 5.1 原因 对于数组元素的访问在操作系统层其实就是对特定内存偏移量的数据的访问 换而言之即如果想要访问一个数组的某一个元素的值那么首先就要计算它的地址偏移量...开始 就要减去1,多一步运算,效率自然不让直接点高 所以数组的索引(下标)从0开始是为了方便计算每个元素的地址 如果从1开始的话,运算起来没有从0开始方便 所以,大部分编程语言数组索引都是从0开始 5.2

    19710

    顺序表、链表相关OJ题(1)

    一、移除元素(力扣) 经典算法OJ题:移除元素 思路1:遍历数组,找到一个元素等于val,就把后面的所有元素往前挪,类似顺序表实现中的指定位置删除!...//思路1:遍历数组,找到一个元素等于val,就把后面的所有元素往前挪,类似顺序表实现中的指定位置删除!...} //循环结束说明插入完成,使用快速排序 qsort(nums1, m + n, sizeof(int), int_cmp); } 思路2:合并的时候顺便排序,利用3个指针,l1用来遍历数组...数组的最后一个有效数据往前 int l2=n-1;//从2数组的最后一个有效数据往前 int l3=n+m-1;//从1数组的最后一个元素开始往前 while(l1>=0 &&...,有连续存放的特点,一方面指针运算偏移比较容易(可以多往指针的方向思考),另一方面就是我可以根据下标去拿到我想要的元素,无论是从前遍历还是从后遍历还是从中间都很方便!

    12110

    面试总结-C++

    (3)从堆上分配 , 亦称动态内存分配 。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。...,指向一个函数,函数参数为int,函数返回参数是一个指针,指针指向一个数组,数组中有10个元素,每个元素是一个void* 指针。...- 指针free或delete之后没有及时置空 => 释放操作后立即置空。 ##### 指针和数组的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。...5.减少全局变量的使用。 6.如果不知道如何处理异常,就不要捕获异常,直接终止比吞掉异常不处理要好。...1,元素的话,一个个比咯:if(p1->age==p2->age)…有一个元素不等,即是两个实例不相等!没什么效率高的方法吧! 2,指针直接比较,如果保存的是同一个实例地址,则(p1==p2)为真!

    2.1K11

    数据结构从入门到精通——顺序表

    顺序表的实现通常依赖于数组,数组是一种静态的数据结构,一旦创建,其大小就是固定的。这意味着在顺序表中插入或删除元素可能会导致空间的浪费或不足。...原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1) 删除排序数组中的重复项 合并两个有序数组 2.4 顺序表的问题及思考 问题: 中间/头部的插入删除,时间复杂度为O(N)...然而,在插入或删除元素时,顺序表的表现就不如链表等其他数据结构了。 在顺序表的头部插入元素时,需要将所有已存在的元素向后移动一位,以腾出空间给新插入的元素。...在顺序表中,尾部元素总是位于数组的最后一个位置,因此删除它不需要移动其他元素。只需将数组的最后一个元素的位置标记为未使用,或者如果使用的是动态数组,可以减少其容量以释放未使用的空间。...线性查找的思想是从表的第一个元素开始,逐个比较每个元素,直到找到目标元素或遍历完整个表。这种查找方法的时间复杂度为O(n),其中n为表的长度。

    18110

    【愚公系列】软考中级-软件设计师 015-数据结构(线性结构)

    链式存储:链式存储是通过存储各数据元素的结点的地址来实现元素的存储,每个结点包含数据域和指向下一个结点的指针。链式存储的特点是插入和删除元素时只需要修改指针,不需要移动其他元素,因此效率较高。...在时间方面:链表在插入和删除元素时效率更高,因为只需要修改指针指向,而顺序表因为地址连续,插入或删除元素后需要移动其他节点。...它只允许在栈的一端进行插入和删除操作,这一端称为栈顶。栈的常用操作有入栈(push)、出栈(pop)和获取栈顶元素(top)。栈可以用数组或链表实现。...它允许在队列的一端(队尾)插入新元素,而在另一端(队头)删除元素。队列的常用操作有入队(enqueue)、出队(dequeue)和获取队头元素(front)。队列可以使用数组或链表实现。...循环队列可以使用数组实现,通过维护两个指针(队头和队尾的索引)来实现循环。在循环队列中,头指针指向第一个元素,尾指针指向最后一个元素的下一个位置。

    25721

    数据结构从入门到精通——队列

    出队列:进行删除操作的一端称为队头 1.2队列的实现 队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。...A 、从队尾插入一个新元素 B、 从队列中删除第i个元素 C、 判断一个队列是否为空 D、 读取队头元素的值 现有一循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。...在初始化队列时,我们首先需要分配一定的存储空间来存放队列元素。这个存储空间可以是数组、链表或其他适合的数据结构。初始化过程中,我们还需设置两个指针,分别指向队头和队尾,以便进行元素的添加和移除操作。...这通常涉及遍历队列,逐个删除元素,并解除队列与其他数据结构或资源的关联。销毁队列后,其不再可用,需重新创建才能使用。...如果头部和尾部指针或索引相同,说明队列为空;否则,队列不为空。此外,也可以使用队列提供的相关函数或方法,如isEmpty()等,来检测队列是否为空。

    38110

    【数据结构】线性表----链表详解

    结点指地是组成数据元素的存储映像,往往指针就是指向结点的,鉴于它不受物理空间限制的优点,往往都会使用指针和结点来更高效率地实现数据结构。...双向链表可以从头节点或尾节点开始遍历,可以方便地在链表中间插入或删除节点。...双向链表 双向链表的每个节点都包含两个指针,一个指向前一个节点,一个指向后一个节点。鉴于这个特点,它与单向链表不同的是,双向链表可以从头到尾或从尾到头遍历链表。...双向链表的作用以及使用场景 需要频繁在链表中间插入或删除节点的情况:双向链表可以在O(1)的时间复杂度内完成插入或删除操作,因此适合在需要频繁插入或删除节点的场景中使用。...需要双向遍历链表的情况:双向链表可以方便地从头到尾或从尾到头遍历链表,因此适合在需要双向遍历链表的场景中使用。

    11510

    深度好文:Linux操作系统内存

    并将 p 所指向的内存空间删除 3、内核态内存分配函数 函数分配原理最大内存其他_get_free_pages直接对页框进行操作4MB适用于分配较大量的连续物理内存kmem_cache_alloc基于...或 delete 后,没有设置为 NULL 指针操作超越了变量的作用范围,比如返回指向栈内存的指针就是野指针 访问空指针(需要做空判断) sizeof 无法获取数组的大小 试图修改常量,如:char...添加元素(insert/push_back 等)、删除元素导致顺序容器迭代器失效 错误示例:删除当前迭代器,迭代器会失效 正确示例:迭代器 erase 时,需保存下一个迭代器 5、C++ 11 智能指针...list std::unordered_map、std::unordered_set用 hash 实现的无序的容器,插入、删除和查找的时间复杂度都是 O(1),在不关注容器内元素顺序的场合,使用 unordered...的容器能获得更高的性能六、 如何查看内存 系统中内存使用情况:/proc/meminfo 进程的内存使用情况:/proc/28040/status 查询内存总使用率:free 查询进程 cpu 和内存使用占比

    1.2K10

    C++@顺序容器(笔记)

    向容器中添加或从容器中删除元素的代价 非顺序访问容器中元素的代价 选择容器的基本原则: 通常,使用vector是最好的选择,除非你有很好的理由选择其他容器。...除非你有很好的理由选择其他的容器,否则应该使用vector。 如果你的程序有很多小的元素,且额外的空间开销很重要,则不要使用list或forward_list。...如果程序要求随机访问元素,应该使用vector和deque。 如果程序要求在容器的中间插入或删除元素,应该使用list或forward_list。...如果程序要求在头尾位置插入或删除元素,不要求在中间位置插入删除元素,则应该使用deque。...一个失效的指针,引用或迭代器 将不再指向任何一个有效的元素,如果使用失效的指针,引用或迭代器将会引发严重的运行时错误问题。 所以我们在使用的容器的时候一定要考虑到迭代器和指针引用失效的情况。

    75630

    数据结构—线性表

    为什么会出现这种移动和删除某一元素时都需要移动大量的元素,是因为相邻两元素的存储位置也是具有相邻关系,他们在内存中的位置也是挨着的,中间没有空虚,不能直接进行插入,要想进行插入,需要先把其他元素进行挪动...,同理,若删除某个元素以后,就会流出空隙,也是需要移动其他元素进行补齐。...我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域,指针域中存储的信息称为指针或链,数据域和指针域组成数据元素的存储映像,称为结点。...聪明的人总是有,有人想出了用数组来代替指针,来描述单链表,让每个数组的元素都由两个数据域组成,数组的每个下标都对应两个数据域,一个用来存放数据元素,一个用来存放next指针。...头插法和尾插法是相对应的一种方法,头插法是从链表的头部开始插入,保持终端结点不变;尾插法是从链表的尾部开始插入,保持头结点不变。

    69730

    动态内存管理

    编译器不一定会支持变长数组的特性。也就是说,这段代码可能在编译器中无法通过编译。 申请内存空间 更通用的方法是,使用头文件stdlib.h中的malloc函数,从内存中申请一段连续的内存空间。...使用完毕后,使用free函数将其释放。free函数的参数是void *类型的指针,而void *类型的指针可以接收任何类型的指针。所以,可以直接将pInt传递给free函数而无需转换。...由于没有保存内存空间的首地址,程序中将无法再通过任何方式使用或释放这些内存空间。...从函数中返回指针 由于通过malloc函数申请的内存空间直到调用free函数释放或程序结束前都是有效的。因此,将指向malloc函数申请的内存空间的指针从函数中返回是合法的。...若指针不为空,才可以使用它。使用完毕后,记得使用free函数释放内存空间。 若在函数中申请一段内存空间作为数组使用,将数组首元素指针从函数中返回。

    54060
    领券