30-seconds-of-cpp项目解析:vector的resize方法详解

30-seconds-of-cpp项目解析:vector的resize方法详解

概述

在C++标准模板库(STL)中,vector是最常用的动态数组容器之一。resize()方法是vector类提供的一个非常有用的成员函数,它允许我们动态地调整vector的大小。本文将深入探讨resize()方法的工作原理、使用场景和注意事项。

resize方法的基本功能

resize()方法的主要功能是改变vector中元素的数量。它有两种重载形式:

  1. void resize(size_type n)
  2. void resize(size_type n, const value_type& val)

当调用resize()时,vector会根据参数n的值进行以下操作:

  • 如果n小于当前size,vector会被截断,只保留前n个元素
  • 如果n大于当前size,vector会扩展,新增的元素会被初始化
    • 对于单参数版本,新增元素会被值初始化(对于基本类型如int,会被初始化为0)
    • 对于双参数版本,新增元素会被初始化为val的值

详细示例解析

让我们通过一个完整的例子来理解resize()的行为:

#include <iostream>
#include <vector>

int main() {
    // 创建一个空vector
    std::vector<int> myVector;
    
    // 第一次resize:扩展到5个元素,默认值为0
    myVector.resize(5);
    // 此时vector内容:0 0 0 0 0
    
    // 第二次resize:扩展到10个元素,新增元素值为1
    myVector.resize(10, 1);
    // 此时vector内容:0 0 0 0 0 1 1 1 1 1
    
    // 输出当前vector内容
    for (int it : myVector) {
        std::cout << it << " ";
    }
    std::cout << std::endl;
    
    // 第三次resize:缩减到5个元素
    myVector.resize(5);
    // 此时vector内容:0 0 0 0 0
    
    // 输出缩减后的vector
    for (int it : myVector) {
        std::cout << it << " ";
    }
    
    return 0;
}

关键点解析

  1. 内存分配:当扩大vector时,resize()可能会触发内存重新分配,这会使所有迭代器、指针和引用失效。

  2. 性能考虑:频繁调用resize()可能导致多次内存分配和元素复制,影响性能。如果知道最终需要的大小,最好一开始就预留足够空间(使用reserve())。

  3. 默认值与指定值:单参数版本使用值初始化,对于类类型会调用默认构造函数,对于基本类型会初始化为0。双参数版本允许指定初始化值。

  4. 缩小操作:当缩小vector时,被移除的元素会被销毁,但capacity(容量)通常不会减少。

实际应用场景

  1. 预分配空间:在处理已知大小的数据前,可以先resize()到合适大小,避免后续多次push_back的开销。

  2. 动态调整:根据运行时的计算结果调整容器大小。

  3. 清空替代resize(0)可以清空vector,但不同于clear(),它不保证释放内存。

注意事项

  1. 异常安全:如果元素类型的构造函数可能抛出异常,resize()不能保证强异常安全。

  2. 与reserve的区别reserve()只改变容量不改变大小,而resize()改变大小并可能改变容量。

  3. 自定义类型:对于自定义类类型,确保有适当的构造函数支持resize()操作。

总结

vector::resize()是一个强大而灵活的工具,正确使用它可以提高代码效率和可读性。理解其内部行为和性能特征对于编写高效的C++代码至关重要。在实际开发中,应根据具体需求选择最合适的容器操作方法。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值