首页
学习
活动
专区
工具
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, vector和deque容器上定义的迭代器都是随机访问迭代器,用作访问内置数组元素的指针也是随机访问迭代器。...istream_iterator是输入迭代器,ostream_iterator是输出迭代器。 另外,虽然map和set类型提供双向迭代器,但关联容器只能使用这部分算法的一个子集。...2、当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新分配整个容器,此时first和end操作返回的迭代器都会失效。...2、在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。 3、在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。

2.3K00

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

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

11010
  • 使用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的大小,可以大大降低迭代器失效的风险。

    17310

    【C++篇】探索STL之美:vector容器讲解

    1.2 为什么使用 vector 与传统的 C 语言定义数组(T array[N])相比,vector 具有以下优势: 动态调整大小,无需手动管理内存; 提供了丰富的接口,支持插入、删除、查找等操作;...迭代器失效问题(难点) 5.3.1 迭代器失效原因与后果 vector 迭代器失效的根本原因在于底层内存的重新分配或元素的移除,导致迭代器指向的内存不再有效。...当发生迭代器失效时,继续使用该迭代器可能会引发未定义行为,如程序崩溃或访问错误数据。...5.3.2 迭代器失效常见行为 一般情况下,vector发生扩容或删除数据,会分配新的内存空间并将原有元素搬移到新的位置,可能就会导致迭代器失效。...对于 erase() 操作,使用函数返回的迭代器继续遍历,以避免出现迭代器失效问题。 编译器差异:不同编译器(如 GCC 和 MSVC)对迭代器失效的处理方式不同,在开发跨平台程序时应尤为注意。

    10500

    《编程千问》第十六问:迭代器失效你了解吗?

    以下是迭代器失效的危害和C++中哪些容器会有这个问题的详细说明,以及以std::vector为例的详细介绍。...C++中的容器和迭代器失效 迭代器失效不仅限于std::vector,它可能发生在任何需要重新分配内存或者改变容器内部结构的STL容器操作中。...以下是一些常见的STL容器和可能导致迭代器失效的操作: std::vector:在容量不足时插入元素会导致内存重新分配,使所有迭代器失效。...以std::vector为例详细介绍 std::vector是一个动态数组,它能够自动管理内存并根据需要调整大小。...通过合理的预分配和迭代器管理,可以有效避免潜在的错误和未定义行为。理解这些原理不仅有助于编写更安全的代码,也能提升程序的性能和稳定性。

    7700

    【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 的使用技巧和性能优化策略。

    41410

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

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

    20610

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

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

    7710

    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...和 迭代器失效 问题 如果你觉得本文写的还不错的话,可以留下一个小小的赞,你的支持是我分享的最大动力!

    25020

    标准库容器

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

    69230

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

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

    89920

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

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

    2.1K30

    【C++篇】深入剖析C++ Vector底层源码及实现机制

    1.2 带大小和默认值初始化构造函数 初始化一个给定大小的vector,并使用默认值填充。 测试构造后大小、容量是否符合要求。...减少容器大小 当新的大小小于当前大小时,resize会移除多余的元素,只保留从起始位置算起的新大小的元素。...):resize只调整size(实际元素数量),不会改变容器的容量(底层分配的内存大小)。...迭代器的实现 begin 函数返回指向 vector 起始位置的迭代器(即指向第一个元素)。 end 函数返回指向 vector 末尾的迭代器(即指向最后一个元素的下一个位置)。...内存管理 自动管理底层内存,不需要开发者手动分配或释放内存,减少内存泄漏的风险。 5. 支持迭代器 提供灵活的迭代器支持,可以轻松遍历、修改元素,并与其他STL算法结合使用。 6.

    20410

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

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

    8910

    【C++】queue和priority_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; }; 对正向迭代器进行封装就可以得到反向迭代器,先有正向再有反向

    11910
    领券