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

std::vector迭代器和大小调整/保留的奇怪/有趣的行为

std::vector是C++标准库中的容器,用于存储动态大小的元素序列。它提供了一组丰富的操作函数,包括迭代器和大小调整/保留的函数。

  1. 迭代器: std::vector提供了多种迭代器,包括begin()、end()、rbegin()、rend()等。这些迭代器用于遍历vector中的元素。例如,使用begin()和end()可以遍历vector中的所有元素:std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } // 输出:1 2 3 4 5
  2. 大小调整/保留: std::vector提供了多种函数来调整或保留其大小,包括resize()、reserve()和shrink_to_fit()。std::vector<int> vec = {1, 2, 3}; vec.resize(5); // 增加大小为5,新增元素使用默认值0进行初始化 // vec: {1, 2, 3, 0, 0} vec.resize(2); // 减小大小为2,超出范围的元素被删除 // vec: {1, 2}
    • resize()函数用于改变vector的大小,可以增加或减少元素的数量。如果增加大小,新元素将使用默认值进行初始化。如果减小大小,超出范围的元素将被删除。
  • reserve()函数用于预留vector的存储空间,以避免频繁的重新分配内存。它可以提高插入元素的效率。std::vector<int> vec; vec.reserve(100); // 预留100个元素的存储空间
  • shrink_to_fit()函数用于释放vector占用的多余内存,将其容量调整为与大小相匹配。注意,这个函数并不保证一定会释放内存,具体实现取决于编译器和标准库的实现。std::vector<int> vec = {1, 2, 3}; vec.resize(0); // 清空vector中的元素 vec.shrink_to_fit(); // 释放多余的内存

std::vector的奇怪/有趣的行为:

  1. 在使用迭代器遍历vector时,如果在遍历过程中对vector进行了大小调整(如插入或删除元素),迭代器可能会失效,导致未定义行为。因此,在遍历过程中最好避免修改vector的大小。
  2. 当使用resize()函数增加vector的大小时,新增的元素会使用默认值进行初始化。这意味着如果vector存储的是自定义类型,需要确保该类型有默认的构造函数。
  3. 当使用resize()函数减小vector的大小时,超出范围的元素会被删除。但是,它们的析构函数不会被调用。如果vector存储的是指针或包含资源的对象,需要手动释放这些资源,以避免内存泄漏。
  4. 在使用reserve()函数预留存储空间时,并不会改变vector的大小。因此,如果在预留空间之后直接使用下标访问vector中的元素,可能会导致访问越界。

总结:

std::vector是C++中常用的动态数组容器,提供了丰富的操作函数。在使用迭代器遍历vector时,需要注意避免修改vector的大小。在调整vector的大小时,需要注意元素的初始化和资源的释放。使用reserve()函数可以提高插入元素的效率,而shrink_to_fit()函数可以释放多余的内存。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

从零开始学C++之STL(三):迭代vector::iterator vector::reverse_iterator 实现、迭代类型、常用容器成员

下面来稍微看一下vector::iterator vector::reverse_iterator 源码: template < class _Ty,          ...map, set, list类型提供双向迭代,而string, vectordeque容器上定义迭代都是随机访问迭代,用作访问内置数组元素指针也是随机访问迭代。...istream_iterator是输入迭代,ostream_iterator是输出迭代。 另外,虽然mapset类型提供双向迭代,但关联容器只能使用这部分算法一个子集。...2、当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新分配整个容器,此时firstend操作返回迭代都会失效。...2、在其首部或尾部删除元素则只会使指向被删除元素迭代失效。 3、在deque容器任何其他位置插入删除操作将使指向该容器元素所有迭代失效。

2.2K00

C++ Vector 容器模拟实现及应用详解

在 C++ 标准模板库(STL)中,vector 是最常用动态数组容器之一。它提供了动态调整大小数组结构,同时保留了数组随机访问高效特性。...,显示出每次扩容时容量翻倍行为。 四、迭代失效问题 vector 迭代在某些操作下可能会失效,尤其是在插入或删除操作涉及到扩容时。...常见迭代失效情况包括: 扩容:当 vector 扩容时,旧内存空间会被释放,指向该空间迭代将变为无效。 插入删除:当元素插入或删除时,后续元素位置可能发生移动,从而导致迭代失效。...// 可能会导致扩容,it 失效 std::cout << *it; // 未定义行为 解决迭代失效常见方法是在扩容或插入、删除操作后重新获取迭代: v.push_back(6); it = v.begin...这一操作确保了 vector 能够动态调整存储空间大小,同时保证已有的数据不丢失。

9710
  • 使用Fastai中学习率查找渐进式调整大小提高训练效率

    我们指定这些是为了确保在编写最少代码并使我们数据对模型可用: 如何使用get_image_files函数获取图像文件:获取训练验证文件夹中所有图像文件 使用parent_label获取类,以确保我们将直接父文件夹名称作为我们类名称...最后,使用GrandparentSplitter分割训练验证,这将为我们提供单独数据集,用于训练验证。...它将使我们批处理大小为bs,图像大小为size。...什么是渐进式调整大小,我们如何应用它? 就像Jeremy在他书中所说那样:使用小图像开始训练,然后使用大图像结束训练。将大多数时期训练花费在较小图像上,有助于更快地完成训练。...这是一种实验技术,与获得相同大小图像时相比,这种技术已被证明在获得更高精度方面非常有用。 现在让我们看看如何训练多种尺寸,对吗? 我们将批处理大小设为64,图像大小设为较小128x128。

    1.5K20

    STL之vector篇(上)还在为学习vector而感到烦恼吗?每次做算法题都要回忆很久,不如来看看我文章,精简又易懂,帮你快速掌握vector相关用法

    1. vector介绍 std::vector是C++标准模板库(STL)中一个非常重要和常用容器。它提供了一种动态数组功能,即可以在运行时根据需要自动调整大小以存储元素。...赋值操作:可以将一个std::vector内容赋值给另一个同类型vector迭代:提供了正向迭代反向迭代,用于遍历vector元素。...总的来说,std::vector是C++中非常强大和灵活容器之一,它结合了数组高效访问动态数组动态大小调整能力,是处理动态数据集合时首选容器之一。...迭代失效意味着迭代不再指向有效内存位置,如果此时尝试通过失效迭代访问或修改元素,程序行为将是未定义。...通过预留空间、使用标准算法避免在迭代过程中修改vector大小,可以大大降低迭代失效风险。

    13010

    【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 高效与优雅

    1.2 为什么使用 vector 与传统 C 风格数组(T array[N])相比,vector 具有以下优势: 动态调整大小,无需手动管理内存; 提供了丰富接口,支持插入、删除、查找等操作; 内置内存管理机制...std; vector v = {1, 2, 3, 4, 5}; // 自动管理内存大小 1.3 vector 优缺点 优点:动态扩展、支持随机访问、效率高。...方法名 功能描述 size() 返回当前元素个数 capacity() 返回分配存储空间大小 empty() 判断容器是否为空 resize(n) 将容器大小调整为 n,多出部分用默认值填充 reserve...在删除操作后应重新获取有效迭代,以避免出现非法访问或程序崩溃。 5.3.5 删除偶数时正确错误写法 错误删除写法在删除元素后没有正确更新迭代,会导致迭代失效,引发未定义行为。...同时,结合不同编译行为差异,帮助读者理解避免 vector 使用中常见错误。无论你是初学者还是高级开发者,这篇文章都将助你全面掌握 vector 使用技巧性能优化策略。

    28810

    C++一分钟之-标准模板库(STL)简介

    迭代(Iterator) 迭代提供了一种统一方式遍历容器中元素,如同指针一样操作,但更为抽象灵活。...适配器(Adapter) 适配器允许你调整现有容器或迭代行为,如堆栈(stack)、队列(queue)基于其他容器实现,迭代适配器则改变迭代行为。 常见问题与易错点 1....迭代失效 问题:在容器大小变化操作(如插入/删除元素)后继续使用迭代。 避免:操作后重新获取迭代,或使用指向容器迭代(如end())。 3....// 使用迭代遍历并打印排序后vector for(auto it = vec.begin(); it !...掌握STL关键在于理解其核心组件、熟练运用容器、迭代算法,并警惕上述常见问题与易错点。通过实践不断探索,你会逐渐感受到STL带来编程乐趣生产力提升。

    18210

    【优选算法】滑动窗口——leetcode——串联所有单词⼦串(hard)

    return ret; } 4.C++知识点 1. std::vector 定义:std::vector是C++标准模板库(STL)中动态数组容器,提供了动态调整大小功能。...特点: 动态大小:可以根据需求自动调整大小。 随机访问:支持高效随机访问,可以通过索引直接访问任意元素。 自动内存管理:自动管理内存分配释放。...pop_back(): 删除末尾元素。 size(): 返回当前元素个数。 operator[]: 通过索引访问元素。 std::vector 是一个动态数组,提供了可以动态调整大小数组实现。...特点: 统一接口:提供统一遍历容器元素方式,无需关注容器内部实现。 类型:包括输入迭代、输出迭代、前向迭代、双向迭代随机访问迭代。...成员函数:定义对象行为。 访问函数修改函数:用于获取设置对象属性。

    7310

    C++ STL学习之【vector模拟实现】

    ---- 前言 vector 是 STL 中容器之一,其使用方法类似于数据结构中 顺序表,得益于范型编程 C++ 特性加持,vector 更强大、更全能;在模拟实现 vector 时,还需要注意许多细枝末节...可以调整容量(reserve),也可以调整大小(resize) reserve 前面已经介绍过了,这里来看看 resize void resize(size_t n, const_reference...pos,需要及时更新 若产生扩容行为迭代 pos 将指向失效空间,这就是迭代失效情况之一 迭代失效时具体表现: 这只是迭代失效其中一种情况:没有更新迭代位置 5.3、...swap 交换函数,因为 std::swap 中会发生多次拷贝构造,效率较低,而 swap 效率是极高,只需交换三个成员变量 vector 中使用是随机迭代,可以使用库中排序函数 std::sort... 迭代失效 问题 如果你觉得本文写还不错的话,可以留下一个小小赞,你支持是我分享最大动力!

    23920

    标准库容器

    array对象大小不是固定,因此,他支持插入删除元素以及改变容器大小操作 容器类型成员 每个容器都定义了多个类型 类型别名 说明 iterator 容器迭代类型成员 const_iterator...容器begin成员end成员 begin成员生成一个指向容器中第一个元素位置迭代 end成员生成指向尾元素之后位置迭代 容器定义初始化 每个容器都定义了一个默认构造函数。...返回新添加第一个元素迭代,若列表为空,则返回p_iterator 向一个vector、string或deque中插入元素会使所有指向容器迭代、引用指针失效 记住,insert函数将元素插入到迭代所指定位置之前...是尾后迭代,则函数行为未定义 c.erase(a_iterator,b_iterator) 删除迭代a_iteratorb_iterator所指定范围内元素,返回一个指向最后一个被删元素之后元素迭代...c.resize(n):调整c大小为n个元素。

    68830

    C++惯用法之消除垃圾收集-资源获取即初始化方法(RAII)

    C++惯用法之消除垃圾收集-资源获取即初始化方法(RAII) 0.导语 在C语言中,有三种类型内存分配:静态、自动动态。...静态变量是嵌入在源文件中常数,因为它们有已知大小并且从不改变,所以它们并不那么有趣。自动分配可以被认为是堆栈分配——当一个词法块进入时分配空间,当该块退出时释放空间。它最重要特征与此直接相关。...他将其称为“资源获取就是初始化”,其基本见解如下:可以指定对象具有构造函数析构函数,这些构造函数析构函数在适当时候由编译自动调用,这为管理给定对象内存提供了更为方便方法。...由于时间不确定,它会在超出该范围后某个时间被垃圾收集清理。有趣是,在Python中,用于非内存资源RAII不是惯用语言。...来自C ++标准库使用RAII示例为std :: stringstd :: vector

    89020

    C++ vector 使用详解(含C++20新特性)

    如果新 size() 大于 capacity(),则所有迭代引用均无效。否则,只有插入点之前迭代引用保持有效。 ...(2) 删除范围内元素 [first, last)。  在删除点或删除点之后使迭代引用无效,包括 end() 迭代迭代 pos 必须有效且可取消引用。...如果新 size() 大于 capacity(),则所有迭代引用(包括过去迭代)都将失效。否则,只有过去迭代是无效。...在将大小调整为更小时,vector 容量不会减少,因为这将使所有迭代失效,而是等效于调用 pop_back() 导致迭代失效情况。   ...作为 std::forward ( args ) ... 转发给构造函数。如果新 size() 大于 capacity(),则所有迭代引用(包括过去迭代)都将失效。

    2K30

    深入探讨C++中双向链表:构建高效数据结构关键方法与实用技巧(下)

    它不仅能够动态地调整大小,还允许我们在任意位置插入删除元素,为开发者提供了极大便利。本文将深入探讨list奥秘,从其底层实现机制到实际应用场景,全面剖析这一容器独特魅力。...我们就vector与list来比较一下: std::list(在C++标准库中通常是双向链表或循环双向链表实现)std::vector在底层实现内存布局上有很大不同,这导致了它们在迭代器使用上区别...内存布局: std::vector是一个动态数组,它在内存中连续存储元素。这意味着std::vector迭代可以简单地通过指针(或指针封装)来实现,因为元素之间地址是连续。...然而,如果迭代指向了一个已被删除节点(例如,通过保留一个已删除节点迭代),则使用该迭代是未定义行为。...迭代类型: std::vector迭代通常是随机访问迭代,支持高效元素访问(通过索引)迭代算术(如加减整数)。

    8010

    【C++】queuepriority_queue

    底层容器需要支持empty、size、front、push_back、pop_back操作 标准容器vector、deque满足上述要求,但默认一般为vector 需要支持随机访问迭代,以便始终在内部保持堆结构...以控制是大堆还是小堆,封装在一个结构体中,作为priority_queue第三个模版参数 主要就是向上调整算法向下调整算法,与之前C语言学过一样,稍有改变 三、仿函数 1、仿函数特征 优先级队列中...,这意味着在多次调用仿函数时,它可以保持并更新这些状态信息,从而影响其行为或返回值 2、仿函数使用 仿函数实际上就是重载括号,使用起来跟函数指针类似,它不仅能够像函数一样被调用,又具有类对象特性,...像我们之前如果写向上调整算法以及向下调整算法,大堆小堆是需要到算法中修改代码,但是有了仿函数就可以直接重载()然后直接调整是less还是greater就好了 ex、有关于list反向迭代 template..._it; } private: Iterator _it; }; 对正向迭代进行封装就可以得到反向迭代,先有正向再有反向

    11110

    C++ STL学习之【vector使用】

    1.1、默认构造 vector 支持三种默认构造方式 默认构造大小为 0 对象 构造 n 个元素值为 val 对象 通过迭代区间构造,此时元素为自定义类型,如 string、vector、Date...迭代 就比较复杂了 复杂归复杂,但每种 容器 迭代器使用方法都差不多,这就是 迭代 设计绝妙之处 注:string vector 迭代都是 随机迭代(RandomAccessIterator...,而且不会造成很多内存碎片 注意: 当 n 小于等于 capacity() 时,reserve 函数不会进行操作 3.3、大小调整 与提前扩容相似的大小调整,主要调整是 _finish 在扩容同时对新空间进行初始化...,此时没有及时更新,再次使用视为非法行为 因此我们认为 vector 在插入或删除后,迭代失效,不能再使用,尤其是 PJ 版本,对迭代失效检查十分严格 至于其具体原因方法,留在下篇文章中揭晓 5.3...这个函数实现原理不同 std::swap,std::swap 实际在交换时,需要调用多次拷贝构造赋值重载函数,对于深拷贝来说,效率是很低vector::swap 在交换时,交换是三个成员变量,

    34721

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——7.list(无习题)

    动态大小:list 大小可以根据需要动态调整,插入删除元素不会像 vector 那样引发频繁内存重新分配。 双向迭代:list 提供双向迭代,可以在链表中向前或向后遍历,灵活度较高。...动态增长:list 在进行插入删除时,不需要担心内存容量问题,因为每次操作都会动态分配或释放内存,大小灵活调整。...= list1.end(); ++it) { std::cout << *it << " "; } 3.5 迭代使用 begin(), end():获取指向第一个元素末尾后一个位置迭代...访问性能:deque 支持常数时间随机访问,而 list 只能通过迭代顺序访问。...总结 C++ 中 list 容器是一种基于双向链表数据结构,适合需要频繁插入删除元素场景。list 提供了灵活增删操作和双向迭代,能够在常数时间内完成插入删除操作。

    10110

    深入探讨C++中双向链表:构建高效数据结构关键方法与实用技巧(上)

    不会失效迭代:在list中插入或删除元素不会导致迭代失效,可以安全地在遍历过程中进行这些操作。 动态内存管理:list能够根据需要动态地调整内存大小,避免了内存浪费。...尝试解引用end()返回迭代是未定义行为。 在修改容器(如插入或删除元素)后,特别是当这些修改影响到迭代所指向元素或其相邻元素时,要格外小心迭代有效性。...注意 由于std::list元素不是连续存储,因此你不能像访问数组或std::vector那样使用下标来访问元素。 迭代是访问链表元素首选方式,因为它们提供了对容器元素灵活访问遍历能力。...重要是要明白,即使std::list迭代在某些操作后可能仍然指向某个位置,但如果那个位置已经不再属于std::list(比如因为它被删除了),那么使用那个迭代就是未定义行为。...动态大小std::list可以动态地增长缩小,不需要预先知道其大小迭代稳定性:在插入删除操作时,除了被删除元素对应迭代外,其他迭代仍然有效。

    10710

    【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程秘密武器

    方法名 功能描述 empty() 检测 list 是否为空 size() 返回 list 中元素数量 max_size() 返回 list 可容纳最大元素数 resize(n) 调整 list 大小为..."Yes" : "No") << endl; // 判断是否为空 lst.resize(3); // 调整大小为3,保留前3个元素 for (int val : lst) {...避免无效访问:通过迭代进行修改时,确保在修改过程中没有删除操作,否则迭代可能失效,导致未定义行为。...第七章:list 迭代失效问题 list 底层实现为双向链表,因此与 vector 不同,list 插入删除操作不会导致整体迭代失效。具体来说: 插入操作:不会导致现有迭代失效。...7.1 删除操作导致迭代失效 删除操作会使指向被删除元素迭代失效,如果在删除元素后继续使用失效迭代,将会导致程序未定义行为。因此,在执行删除操作后,我们必须重新更新迭代

    18110
    领券