1. vector std::vector是C++标准库中的单端数组,其属于顺序容器(Sequence Containers),同时内存分配是连续的,当容量不足以容纳新元素时,它会自动重新分配一块更大的内存区域...// 范围for循环(推荐) for (const auto &elem : vec) { std::cout << elem << " "; } // 迭代器 for (auto it =...删除元素: 因为迭代器.begin()重载了运算符+,因此可以使用vec.begin() + 2这种形式来选择第三个元素。...查找第一个出现的元素: 如果要查找所有匹配的元素,加一个while循环+迭代器就可以实现了。...空间开销:哈希表通常需要更多的内存空间来存储元素和哈希桶。 内存分配:哈希表可能需要动态地重新分配内存以调整哈希桶的数量。
当你以局部变量形式创建并初始化 vector 时,对象本身是存储于栈内存当中,但是它所存储的元素却是在堆内存当中连续的一块空间,因此 std::vector 对于随机访问效率会非常高。...vector 的存储是自动管理的,按需扩张收缩。 vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。...> 它的操作方式和 std::list 基本相同,但是,由于它是单向链表,所以它没有反向迭代器。...是一个同时管理着索引区块与对应数据区块的结构,它通过一个类似于 MAP 的 Key:Value 形式来记录所拥有的内存区块。...cbegin 返回指向起始的常量迭代器。(const修饰) cend 返回指向末尾的常量迭代器。(const修饰) clear 清除所有元素。 contains(c++20) 检查是否存在指定键。
数组以指针的形式支持迭代器,但数组是C++语言的一部分,并非库。...: (基于数组地容器) 在一个或多个动态分配的内存块中保存它们的元素,如果一个新元素被插入或已经存在元素被删除,其他在同一个内存块的元素就必须向上或者向下移动来为新元素提供空间或者填充原来被删除的元素所占的空间...,当你把迭代器传给erase时记得后置递增它 * * 3,在循环内做某些事情(除了删除对象之外) * 3.1 如果容器是标准序列容器,写一个循环来遍历容器元素,每当调用erase时记得都用它得返回值更新你得迭起器...* 3.2 如果是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增 * */ 条款10:注意分配器得协定和约束 什么是STL内存分配器?...* 的内存,那使 我们的 Allocator对象没有用了,因为它不为 ListNode分配内存,他为 T分配内存 * 因此,list从未让它的 Allocator做任何分配了
C++ 用当前迭代器的值是否等于 end() 代表的结束位置迭代器的值来判断是否遍历结束。 Java 的 Collection 也有迭代器的机制,Java 用 hasNext() 判断是否遍历结束。...除了以上的 for 循环语句,C++ 还支持 for_each() 形式的遍历 + 处理操作,也是配合迭代器使用,for_each() 的前两个参数是一对迭代器,代表循环的起始位置和结束位置。...C++ 中定义数组的同时就分配了存储空间,所以在定义时要指定长度,使用 new 动态申请内存时,要指定长度。...Java 如果仅仅是声明一个数组,可以不指定长度,因为此时并不分配存储空间,需要分配空间的时候,用 new。与之对应的 Java 语言的形式是: ?...C++ 的函数有很多类型修饰,比如常见的 const,C++11 后新增了 final 和 override,但是 = 0 一直是一个比较奇怪的存在,它表明这个函数没有实现,需要在派生类中实现,同时,也说明这个类是不能被实例化的
基于范围的for循环的语法形式如下: for (declaration : expression) { // 循环体 } 其中: declaration:在每次循环迭代中,声明一个变量,用于接收容器中的元素...这种语法形式简洁清晰,避免了传统for循环中需要显式地使用迭代器或索引的繁琐。...它帮助提高代码的可读性和可维护性,并且可以帮助编译器检查是否正确地重写了基类的虚函数。...智能指针的使用可以有效地管理动态分配的资源,并减少内存泄漏的风险。在编写现代C++代码时,推荐优先使用智能指针而不是裸指针来管理资源。...使用范围-based for 循环: 在 C++11 中,我们还可以使用范围-based for 循环来遍历容器,它自动使用 begin() 和 end() 函数获取容器的迭代器。
判断一个对象是否是可迭代的,主要看它是否具有 __iter__() 方法。...迭代器 iter_lst 比列表 lst 节省内存。对于迭代器对象,内存中虽然已经有了它,但对象的成员没有占用内存空间。而列表一经创建之后,其所有成员已经被读入了内存。...在迭代器中,有一个“指针”(注意,这里加了引号),它指到哪个成员,在执行 __next__() 方法时就将该成员读入内存,“指针”随后指向下一个成员。...注释(1)重新生成一个迭代器,然后用注释(2)的 for 循环读取其成员。如果再次循环(如注释(3)所示),也没有读到内容,原因同前。...但是,因为迭代器的特点,那些斐波那契数在执行后面的列表解析之前没有一个被读入内存。只有当执行了后面的列表解析,才有指定数量的数字被读入内存,并组合成了一个列表。
全局变量是整个程序都可访问的变量,生存期从程序开始到程序结束;局部变量存在于模块中(比如某个函数),只有在模块中才可以访问,生存期从模块开始到模块结束。...当一个构造函数被调用时,它做的首要的事情之一是初始化它的VPTR。因此,它只能知道它是“当前”类的,而完全忽视这个对象后面是否还有继承者。...5. vector迭代器失效的情况 当插入一个元素到vector中,由于引起了内存重新分配,所以指向原内存的迭代器全部失效。...内存的分配方式有几种? 1) 从全局存储区域分配:这时内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如:全局变量、static静态变量。...动态分配不需要提前分配存储空间,可以动态的调整大小。 4) 生命周期不同: 静态分配的内存在程序一开始运行就会分配内存,直到程序结束了,内存才会被释放。
std::shared_ptr 是 C++11 引入的智能指针,用于管理动态分配的对象。它允许多个指针共享对同一对象的所有权,提供了一种更安全和方便的内存管理方式,避免了内存泄漏和悬空指针的问题。.../ 共享同一个对象 std::shared_ptr ptr2 = ptr1; 动态内存管理: 使用 std::make_shared 或 std::shared_ptr 的构造函数来动态分配对象...使用 std::make_shared 来分配动态对象,因为它能更好地管理内存。 当共享同一个资源时,确保在不再需要时及时释放智能指针。...std::shared_ptr 是 C++ 中常用的智能指针之一,可以帮助管理动态分配的资源,避免内存泄漏,并提高代码的安全性和可维护性。 5....循环结束: 如果循环结束仍未找到目标,则返回 -1 表示目标不存在。
如果没有 explicit 关键字,下面的代码也是有效的: std::stack myStack = mydeque; // 这一行在 explicit 关键字存在时是不合法的 但有 explicit...pushi 没有指向 pushV 结尾就继续循环 在每次循环中,将 pushV 中当前位置 pushi 的元素推入栈 s 然后,使用一个内部 while 循环检查此时栈顶元素是否等于 popV...中相应位置 popi 的元素: 如果相等,则从栈 s 中弹出栈顶元素,并将 popi 指针后移一位以检查下一个出栈元素 如果不相等或栈已空,则中断内部 while 循环 在外部 while 循环结束一次循环之后...内存分配:deque 不保证所有元素都连续存储,因此不能依赖像 std::vector 那样的内存连续性 性能:在两端插入或删除元素通常是常数时间复杂度 O(1),但是在中间位置插入或删除元素的时间复杂度通常是线性的...因此deque的迭代器设计就比较复杂 中控数组满了就扩容,它的消耗会小很多 它的迭代器有四个指针 start指向指向第一个buff的第一个数据 finish指向最后一个buff的最后一个数据的下一个位置
但是,没有绝对的安全,更没有绝对的内存安全。Rust 只是消除了比较常见的内存安全问题。...虽然C语言缺少这个功能,但大多数没有goto的语言都有这个功能。 也可以从一个无限循环中以值 break,这将导致循环表达式计算为该值,而不是!。...std::mem::needs_drop()这个函数可以用来发现一个类型是否需要被drop;即使它没有drop方法,它也可能递归地有一个字段可以drop。...许多基本的核心类型也是这样通过std crate访问的。 Rust 没有头文件,也没有声明顺序的限制;一个crate 内的模块可以自由地形成循环的依赖关系,因为它们不是编译的单位,只是命名空间。...注意,S后面的内存改变了,所以必须在.data或.bss部分分配。这说明了UnsafeCell的另一个特性:它导致本来被声明为不可变的数据被分配为可变的。
begin() : 返回第一个元素的迭代器 capacity() : 返回vector所能容纳的元素数量(在不重新分配内存的情况下) clear() : 清空所有元素 empty() : 判断Vector...总结:支持随机访问,但效率没有 vector 高,在头部和尾部插入或删除效率高,但在中间插入或删除效率低,适用于既要频繁随机访问,又要关心两端数据的插入与删除的场景。...没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存。...0x51 特点 内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供 [] 操作符的重载。...,集合中以一种特定的顺序保存唯一的元素。
/** STL容器可以自动增长到足以容纳你放进去的数据,在最大大小范围之内 vector和string利用 realloc等价的思想进行空间增长: 1,分配新的内存块,是容器目前容量的几倍,每次以 2...为因数增长 2,把所有元素从容器的旧内存拷贝到它的新内存 3,销毁旧内存中的对象 4,回收旧内存 首先介绍以下四个让人困惑的函数: 1,size() 容器中有多少个元素,并没有告诉你容器为它容纳的元素分配了多少内存...2,capacity() 指出容器在它已经分配的内存中可以容纳多少元素,利用 capacity() - size() 得到有多少没有被占用的内存 3,resize() 强制把容器改为容纳 n 个元素,...n,提供的n不小于当前大小,强迫进行一次重新分配,增加容量 因此,可以得知 reserve 允许你最小化必须进行的重新分配的次数,避免真分配的开销和迭代器/指针/引用的失效 */ std::vector...m[2] = m2; //map m -> m[K] = V; map::operator[] //检查k是否已经在map里,如果不,就添加上,以V作为它的对应值,如果k已经在map
wiki 上说:事件循环是”一种等待程序分配事件或者消息的编程架构“。基本上来说事件循环就是:”当A发生时,执行B"。...或者用最简单的例子来解释这一概念就是每个浏览器中都存在的JavaScript事件循环。...当你点击了某个东西(“当A发生时”),这一点击动作会发送给JavaScript的事件循环,并检查是否存在注册过的onclick 回调来处理这一点击(执行B)。...同时丛书线程以动画形式旋转指针 signal.go = False spinner.join() # 等待spinner 线程结束 return result def main...# 通过协程以动画的形式显示文本式旋转指针 import asyncio import itertools import sys @asyncio.coroutine # 打算交给asyncio
Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。...print n...打印10次'A'无限序列只有在for迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。...,imap()可以作用于无穷序列,并且,如果两个序列的长度不一致,以短的那个为准。...for循环对r进行迭代,才会在每次循环过程中计算出下一个元素:>>> for x in r:......小结itertools模块提供的全部是处理迭代功能的函数,它们的返回值不是list,而是迭代对象,只有用for循环迭代的时候才真正计算。
悬挂指针错误示例: 指向动态分配内存的指针在释放内存后仍被继续使用。...循环体内的副作用错误示例: 在循环体内修改迭代变量,导致意料之外的循环行为。for (std::vector::iterator it = vec.begin(); it !...动态内存分配和释放不匹配错误示例: 使用不同的分配和释放函数,导致内存泄漏或程序崩溃。...,以确保匹配:int* memory = new int[10];delete[] memory; // 使用delete[]释放动态分配的数组并且,遵循RAII原则,优先考虑使用智能指针(如std:...:unique_ptr或std::shared_ptr)来自动管理内存,避免手动分配和释放内存带来的问题。
也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理 本质讲,vector使用动态分配数组来存储它的元素。...vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。...这是默认构造函数,它创建一个空的 std::vector 对象。如果提供了分配器(allocator),则使用提供的分配器;否则使用默认分配器。...这个构造函数创建一个包含==n 个元素的 std::vector,每个元素的值都是 val ==。同样地,您可以选择提供一个分配器,如果没有提供,则使用默认分配器。...这个函数可以用来避免多次重新分配内存的开销,从而提高性能。
请你回答一下智能指针有没有内存泄露的情况 参考回答: 当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄漏。...,const_map不能用,只希望确定某一个关键值是否存在而不希望插入元素时也不应该使用,mapped_type类型没有默认值也不应该使用。...,这些描述如将会以epoll_event结构体的形式组成一颗红黑树,接着阻塞在epoll_wait,进入大循环,当某个fd上有事件发生时,内核将会把其对应的结构体放入到一个链表中,返回有事件发生的链表。...当进行内存分配时,Malloc会通过隐式链表遍历所有的空闲块,选择满足要求的块进行分配;当进行内存合并时,malloc采用边界标记法,根据每个块的前后块是否已经分配来决定是否进行块合并。...如果内存池只有一个node的空间,直接返回给用户。 z. 若果如果连一个node都没有,再次向操作系统请求分配内存。 ①分配成功,再次进行b过程。 ②分配失败,循环各个自由链表,寻找空间。 I.
在每一次循环中,我们通过*it操作符获取迭代器指向的字符,并将其打印出来。然后,迭代器it向前移动到下一个位置,直到达到字符串的末尾为止。...按照1.5倍扩容的方式,每次扩容时将当前内存块的大小乘以1.5,以提供更适当的额外空间。这种方式可以在一定程度上减少内存的浪费,同时仍然提供足够的空间用于字符串的增长。...重新分配内存空间会导致性能损耗,因此在添加大量元素之前,可以使用reserve()函数预先分配足够的容量,以避免频繁的内存分配和复制操作。...reserve() ps:只会影响capacity不会影响size 在C++中,reserve()函数用于预分配容器对象的内存空间,以提前为容器对象分配足够的内存,避免频繁的内存分配和复制操作。...因此,预分配的容量可以大于或等于实际存储的元素数量。 总而言之,reserve()函数用于预分配容器对象的内存空间,以提前为容器对象分配足够的内存,避免频繁的内存分配和复制操作。
C++随记(四)---动态数组vector 前面两篇博文简单讲了一下C++通过new分配动态内存的问题。...4个要点: ①使用vector对象时要包含头文件:#include ②vector包含在名称空间std中; ③使用时还是应该像数组那样指出它存储的数据类型; ④可以有很多方法来指定它的元素数...( a ); } 此操作就是在每次循环时,往数组cars的屁股后面装入一个元素a. ②动态数组的长度—size( ): 由于我并未定义cars的长度,如果我现在需要用到它的长度该怎么半呢?...会提示内存溢出!!vector subscript out of range! 因为一开始并没有说你容器vec究竟有多大,所以vec.at(2)这个位置并没有被分配内存!...多用resize( )函数; vec.resize( 5); 也就是给vec分配5个单位的内存空间,这样你直接对元素进行操作就能找到地方了。
领取专属 10元无门槛券
手把手带您无忧上云