首页
学习
活动
专区
工具
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.1K00

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

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

1.4K20

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

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

9210

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

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

6810

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

22420

标准库容器

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个元素。

67830

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

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

1.9K30

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

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

87620

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 在交换时,交换是三个成员变量,

30421

vector入门&迭代失效问题详解

在C++std::vector中,finish可能用来表示容器结束,但实际使用时应该使用end()成员函数(end()_finish指向相同)。...总结:std::vector迭代失效避免方法 插入操作 当向std::vector中插入元素时,如果插入操作导致重新分配内存(即容量不够,需要扩展),所有的迭代都会失效。...与静态数组不同,std::vector 可以在运行时动态调整大小。我们可以使用 std::vector 来构造一个动态二维数组。...动态调整大小 使用 std::vector 构造二维数组可以在运行时动态调整大小。我们可以使用 resize 方法调整二维数组列。...使用 std::vector 构造动态二维数组为我们提供了极大灵活性。与静态数组不同,std::vector 可以在运行时动态调整大小,使其更适合处理动态数据集。

13510

现代C++之容器

vector 一个主要缺陷是大小增长时导致元素移动。如果可能,尽早使用 reserve 函数为 vector 保留所需内存,这在 vector 预期会增长很大时能带来很大性能提升。...因此,调用这个函数之后,就可以引用容器内对象了。因此当加入新元素时,用operator[]操作符,或者用迭代来引用元素对象。此时再调用push_back()函数,是加在这个新空间后面的。...此外,关联容器都有 find、lower_bound、upper_bound 等查找函数,结果是一个迭代: find(k) 可以找到任何一个等价于查找键 k 元素(!...正常情况下,向 std 名空间添加声明或定义是禁止,属于未定义行为。 从实际工程角度,无序关联容器主要优点在于其性能。...7.array C 数组在 C++ 里继续存在,主要是为了保留 C 向后兼容性。

1K10

算法刷题小技巧总结

(判断素数,“1”) 保留小数问题 #include #include using namespace std; cout<<setiosflags(ios::fixed...你或许可以使用std::ios::sync_with_stdio(false); 这条语句关掉scanfcin同步,加快效率。...但是即使这样cin还要慢,而且一旦使用了这条语句,scanfcin混用可能就会造成一些奇怪错误 语言灵活运用:大数处理可以用pythonjava,java需要引包:即BigIntegr类 BigDecimal...for_each (20)条件移除remove_if 并不是所有迭代都有加减法。...能进行算术运算迭代只有随机访问迭代,要求容器元素存储在连续内存空间里,vector,string,deque迭代是有加减法,但是map,set,multimap,multiset迭代是没有加减法

47100

C++标准库里二分查找算法剖析

__pred(__first)) ++__first; return __first; } 出于其他考虑,我们保留vector容器,再引入二分查找算法,正好C++标准库提供了lower_bound...<< std::endl; } 由于lower_bound返回是[v.begin(), v.end()]中第一个大于或等于查找值迭代,所以我们需要额外判断元素是否找到且真的相等。...简单比对find_iflower_bound在不同大小(100~1000000)vector(元素已排序)下查找相同元素(最大元素)耗时如下: 企业微信截图_15639671383718.png 说明标准库还是值得信赖...__first__last距离,进而在每次迭代步长__half;advance用于向前推进步长: template inline _GLIBCXX14...下面以listvector为例,给出lower_bound这种行为直观展示: 企业微信截图_15639699383291.png 所以,标准库虽好,可不要违反科学哦,相信也不会有人在链表上使用二分查找吧

2.4K10

C++STL vector详解(杂谈)

介绍 这篇文章目的是为了介绍std::vector,如何恰当地使用它们成员函数等操作。本文中还讨论了条件函数函数指针在迭代算法中使用,如在remove_if()for_each()中使用。...Vector总览 vector是C++标准模板库中部分内容,它是一个多功能,能够操作多种数据结构算法模板类函数库。...c.end() 指向迭代最后一个数据地址。 c.erase(pos) c.erase(beg,end) 删除pos位置数据,传回下一个数据位置。...c.reserve() 保留适当容量。 c.size() 返回容器中实际数据个数。 c1.swap(c2) swap(c1,c2) 将c1c2元素互换。 同上操作。...std::vector vNew(v); cout << vNew.capacity(); vNew.capacity()返回是7。这说明新创建只是根据实际大小来分配空间。

1.1K90

C++(STL):21---deque之源码剖析

也因此,deque没有必要提供所谓空间保留(reserve)功能 deque迭代:虽然deque也提供 Ramdon Access Iterator,但它迭代并不是原生指标,其复杂度 vector...避开了“重新配置、复制、释放”轮回,代价则是复杂迭代架构 受到分段连续线性空间字面影响,我们可能以为deque实现复杂度vector相比虽不中亦不远矣,其实不然。...维护其“整体连续”假象任务,着落在迭代operator++ operator-- 两个运算符身上 让我们思考一下,deque迭代应该具备什么结构: 首先,它必须能够指出分段连续空间(亦即缓冲区...迭代其他函数(附set_node函数) 下面是deque迭代几个关键行为。..., finish两个迭代: 分别指向第一缓冲区第一个元素最后缓冲区最后一个元素下一位置(可以参见上图) 此外它也记住目前map大小

1K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券