最近无论是面试还是笔试,有一个高频问题始终阴魂不散,那就是给一个大文件,至少超过10g,在内存有限的情况下(低于2g),该以什么姿势读它? ...当代码执行到 for line in file 时,line 将会变成一个非常巨大的字符串对象,消耗掉非常可观的内存。 ...那么在一台pc上,这个过程会足足花掉 65 秒,并在执行过程中吃掉机器 2GB 内存 为了解决这个问题,我们需要暂时把这个“标准做法”放到一边,使用更底层的 file.read() 方法。...iter(iterable) 是一个用来构造迭代器的内建函数,但它还有一个更少人知道的用法。...当我们使用 iter(callable, sentinel) 的方式调用它时,会返回一个特殊的对象,迭代它将不断产生可调用对象 callable 的调用结果,直到结果为 setinel 时,迭代终止。
) 改变vector的capacity capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2 倍增长的。...这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是 根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。...reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代 价缺陷问题。 resize在开空间的同时还会进行初始化,影响size。...capacity获取容量大小 capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2 倍增长的。...这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是 根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
iterator 的使用 2.3 vector 空间增长问题 capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。...这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。...vs是PJ版本STL,g++是SGI版本STL reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题 resize在开空间的同时还会进行初始化,...it); ++it; } } 迭代器失效解决办法:在使用前,对迭代器重新赋值即可 3.vector深度剖析及模拟实现 3.1 使用memcpy拷贝问题 假设模拟实现的vector中的reserve...接口中,使用memcpy进行的拷贝,以下代码会发生什么问题?
vector 的 capacity capacity 的代码在 vs 和 g++ 下分别运行会发现, vs 下 capacity 是按 1.5 倍增长的, g++ 是按 2 倍增长的 。...这个问题经常会考察,不要固化的认为, vector 增容都是 2 倍,具体增长多少是根据具体的需求定义的。vs 是 PJ 版本 STL , g++ 是 SGI 版本 STL 。...中要存储元素大概个数,可以提前将空间设置足够 // 就可以避免边插入边扩容导致效率低下的问题了 void TestVectorExpandOP() { vector v; size_t sz...vector 的数据空间 operator[] (重点) :像数组一样访问 vector 迭代器失效问题 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了...// 方便解决:一边遍历一边删除的迭代器失效问题 iterator erase(iterator pos) { // 挪动数据进行删除 iterator begin = pos
2、g++下vector的扩容机制 同样的代码,在g++下编译运行后可以看到,g++下vector是按2倍方式扩容!...的迭代器失效问题(重点) 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对 指针进行了封装,vector的迭代器就是原生态指针T* 。...3、g++下迭代器失效问题 Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理方法也没有vs下极端。...、erase删除任意位置代码后,与vs下不同,Linux g++下迭代器并没有失效 ,因为空间还是原来的空间,后序元素往前搬移了,it的位置还是有效的。...STL中很基础同时也很重要的容器,里面涉及深浅拷贝,扩容机制,迭代器失效等多种问题,这些问题需要在使用时注意,避免出现错误,同时也要知道这些问题产生的原因,以及如何正确处理。
判断是否为空 resize(重点) 改变 vector 的 size reserve (重点) 改变 vector 的 capacity capacity的代码在vs和g++下分别运行会发现,vs下...capacity 是按1.5倍增长的, g++是按2倍增长的。...这个问题经常会考察,不要固化的认为,顺序表增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。...2.vector 深度剖析及模拟实现 ---- 2.1 vector 的核心接口实现(要点都在注释中) 其中的几个要点问题: 为何要重载一个 int 版本的构造函数,而不是直接使用 size_t 版本的...所以我们得重载一个 int 版本的,才能避免这种问题。 而 size_t版本 与 int版本 差别在于官方中默认的接口就是为size_t版本,除此之外,size_t能表示的范围更广,而int范围小。
国际组织 IEEE 和 OIF 都已着手在 224Gb/s 线路上定义 800G 和 1.6T。以下是实现800G 和 1.6T(基于224Gb/s 通道速率)的几个挑战和潜在解决方案。...下一代交换机硅将再次把带宽翻倍,102.4T 交换机将拥有 512 个 200Gb/s SerDes 通道。这些硅交换机将通过 224Gb/s 通道支持 800G 和 1.6T。...图:FEC 架构类型 图:不同FEC类型的权衡取舍 虽然 FEC 有助于减轻发送器和接收器之间随机误差的影响,但突发误差仍会造成问题。...但是,由于每个数据中心平均有 5万个光模块,模块的平均功耗越来越高,仍然是一个问题。 图:各代光模块之间的功耗(资料来源:Eoptolink) 为了提高能效,研发人员正在研究替新的封装方案。...共封装光学器件正在研发中,因此业界可能会继续在 800G 系统中使用可插拔光学器件。800G 或 1.6T 标准的后续版本可能会使用共封装光学器件。 800G 和 1.6T 网络的时间表是什么?
(重点) 改变vector的capacity capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。...这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。...中要存储元素大概个数,可以提前将空间设置足够 // 就可以避免边插入边扩容导致效率低下的问题了 void TestVectorExpandOP() { vector v; size_t sz...1.2.5 vector 迭代器失效问题。(重点) 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。...2.vector深度剖析及模拟实现 2.1 std::vector的核心框架接口的模拟实现bit::vector 2.2 使用memcpy拷贝问题 假设模拟实现的vector中的reserve
vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2 倍增长的。...这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是 根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。...reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代 价缺陷问题。...注意:Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端 // 1....假设模拟实现的vector中的reserve接口中,使用memcpy进行的拷贝,以下代码会发生什么问题?
resize(重点) 改变vector的size reserve (重点) 改变vector的capacity capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5...倍增长的,g++是按2倍增长的。...vs是PJ版本STL,g++是SGI版本STL。 reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。...中要存储元素大概个数,可以提前将空间设置足够 // 就可以避免边插入边扩容导致效率低下的问题了 void TestVectorExpandOP() { vector v; size_t sz...二、vector深度剖析及模拟实现 1、std::vector的核心框架接口的模拟实现xz::vector vector的模拟实现 2、使用memcpy拷贝问题 假设模拟实现的vector中的reserve
vector 空间增长问题 vector 增删查改 vector 迭代器失效问题 引起底层空间改变 erase g++与vs检测比较 string迭代器失效 vector 在OJ中的使用 只出现一次的数字...杨辉三角 练习题 三、vector深度剖析及模拟实现 std::vector的核心框架接口的模拟实现bit::vector 使用memcpy拷贝问题 问题分析 动态二维数组理解 前言 C++中的vector...和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。...这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。...= v.end()) {if (*it % 2 == 0) it = v.erase(it); else ++it; } return 0; } g++与vs检测比较 Linux下,g+
vector 的 capacity capacity 的代码在 vs 和 g++下分别运行会发现: vs 下 capacity 是按 1.5 倍增长的, g++ 是按 2 倍增长的。...这个问题经常会考察,不要固化的认为,顺序表增容都是 2 倍,具体增长多少是根据具体的需求定义的。vs 编译器是 PJ 版本 STL,而 g++ 是 SGI 版本 STL。...,且释放内存 6. vector 迭代器失效问题(重点) 迭代器是一种检查容器内元素并遍历元素的可带泛型数据类型。...= v.erase(it),这样子就能避免失效问题 int main() { vector v{ 1, 2, 3, 4 }; auto it = v.begin();...Ⅱ. vector 深度剖析及模拟实现 一、 vector 的核心接口实现 其中的几个要点问题: 为何要重载一个 int 版本的构造函数,而不是直接使用 size_t 版本的?
capacity的代码在vs和g++下分别运行会发现, vs下capacity是按照1.5倍增长的, g++是按2倍进行增长的, 这个问题经常会考察, 不要固化的认为, vector增容都是2倍, 具体增长多少是根据具体的需求定义的..., vs是PJ版本STL, g++是SGI版本STL. reserve只负责开辟空间, 如果确定知道需要用多少空间, reverse可以缓解vector增容的代价缺陷问题 resize在开空间的同时还会进行初始化...可以执行下面代码在VS和g++编译器分别进行测试vector的扩容机制 // 测试vector的默认扩容机制 void TestVectorExpand() { size_t sz; vector的大概个数, 可以提前将空间设置足够,就可以避免边插入边扩容导致效率低下的问题了 举个例子: void TestVectorExpandOP() { vector v; size_t..., 其底层实际就是一个指针, 或者是对指针进行了封装, 比如: vector的迭代器就是原生态指针T* , 因此迭代器失效, 实际就是迭代器底层对应指针所指向的空间被销毁了, 而使用的一块已经被释放的空间
vector(size_t n, const T& val = T())//引用和指针在赋值时,有可能出现权限问题。这里需要用常量引用,否则无法接收常量值。...vectorT>& operator=(vectorT> v)//返回引用,符合连续赋值的含义 { swap(v); return *this; } 三、迭代器失效(异地扩容引起的野指针问题)...for (auto e : v) { cout << e << " "; } cout << endl; } 2.vs和g++对于erase后迭代器是否失效的处理手段(一个极端,一个温和) 1...对于vs编译器来说,他是认为erase后迭代器是失效的,在2013的版本下会直接报断言错误,在2022版本下会越界访问,而g++对迭代器失效的检测并不是非常严格,处理也没有vs下极端。...//因为在erase之后我们统一认为迭代器it失效了,所以需要erase的返回值来更新迭代器,代码在VS和g++下面都可以跑。
, 当拷贝时它的特殊部分丢失了 //如何解决以上问题呢?...f(double); //带函数的说起 //声明一个函数g, 带有一个参数, 那个参数指向一个没有参数, 返回double的函数的指针 int g(double (*pf)()); //同上,pf使用非指针语法...int g(double pf()); //同上, 参数名可以忽略,去掉了pf这个名字 int g(double ()); //注意:参数名左右的括号可以被忽略,但是单独的括号指出存在一个参数列表:...} //如果避免这种问题:必须保证在调用 erase之前就得到了c中下一个元素得迭代器,因此在 i 上使用后置递增 for(std::set::iterator i = caaaa.begin...rebind带有一个类型参数,U,并且只定义一个typedef,other。 other是A的一个简单名 字。
PrintVector(v); } vector 空间增长问题 capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。...这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义 的。 vs是PJ版本STL,g++是SGI版本STL。...reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。 resize在开空间的同时还会进行初始化,影响size。 ...),因为vector刚刚创建 // 在许多实现中,新创建的vector的容量可能是0或某个小的正值 size_t sz = v.capacity();...vector深度剖析及模拟实现 std::vector的核心框架接口的模拟实现bit::vector 使用memcpy拷贝问题 假设模拟实现的vector中的reserve接口中,使用memcpy进行的拷贝
来看一个问题: 在使用C++ STL的vector时,下面三种写法有什么不同呢?其内存分配是怎么样的呢?...std::vectorT> vec; std::vectorT>* Vec = new std::vectorT>(); std::vectorT*> vec; 首先,说结论吧(假设T是一个定义好的类...T>();vec和其中的元素T都保存在堆上; 对于std::vectorT*> vec;vec在栈上(stack),而其中的元素T保存在堆上(heap);和第一种情况类似。...所以,我个人觉得两者的主要区别在于:std::vectorT>和std::vectorT*>中元素T都是存储在栈上,而且std::vectorT>不用手动管理内存空间,而std::vectorT...但是push_back的时候std::vectorT>会比std::vectorT*>多一个拷贝构造的过程。
注:capacity的代码在vs和g++下分别运行会发现,vs 下capacity是按1.5倍增长的,g++是按2 倍增长的。...不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。...中要存储元素大概个数,可以提前将空间设置足够 // 就可以避免边插入边扩容导致效率低下的问题了 void TestVectorExpandOP() { vector v; size_t sz...因此,问题就产生了,编译器使用模板的原则是有更合适的就选更合适的。...2.2 使用memcpy拷贝问题 假设模拟实现的vector中的reserve接口中,使用memcpy进行的拷贝,以下代码会发生什么问 题?
capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。...vs是PJ版本STL,g++是SGI版本STL; reverse只负责开辟空间,如果确定知道需要用多少空间,reverse可以缓解vector增容的代价缺陷问题; resize在开空间的同时还会进行初始化...迭代器失效问题 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T*。...// 方便解决:一边遍历一边删除的迭代器失效问题 iterator erase(iterator pos) { // 挪动数据进行删除 iterator begin = pos...在vector模拟实现的reverse接口中,若使用memcpy进行拷贝,以下代码会发生什么问题?
若有问题 评论区见 欢迎大家点赞收藏⭐文章 1.vector的介绍 vector介绍:vector vector的定义 2.vector的使用 2.1vector iterator 的使用 2.2vector...空间增长问题 capacity 的代码在 vs 和 g++ 下分别运行会发现, vs 下 capacity 是按 1.5 倍增长的, g++ 是按 2 倍增长的 。...这个问题经常会考察,不要固化的认为, vector 增容都是 2 倍,具体增长多少是 根据具体的需求定义的。 vs 是 PJ 版本 STL , g++ 是 SGI 版本 STL 。...reserve 只负责开辟空间,如果确定知道需要用多少空间, reserve 可以缓解 vector 增容的代 价缺陷问题。...2.3vector增删查改 2.4vector迭代器失效问题 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对 指针进行了封装 ,比如: vector 的迭代器就是原生态指针
领取专属 10元无门槛券
手把手带您无忧上云