首页
学习
活动
专区
工具
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()函数可以释放多余的内存。

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

相关·内容

没有搜到相关的结果

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券