现在位置: 首页 > C++ 教程 > 正文

C++ <vector> capacity 函数

C++ 容器类 <vector> C++ 容器类 <vector>


capacity 是 vector 中用于查询容量的函数,它返回容器当前分配的存储空间大小。

capacity 是容器类的成员函数,用于返回容器当前分配的存储空间能够容纳的元素数量。这个值通常大于或等于 size()

capacity 反映了 vector 内部预分配的内存空间,理解它有助于优化程序性能和避免不必要的内存重新分配。

单词释义capacity 表示"容量",即容器能够容纳元素的数量。


基本语法与参数

capacity 是容器类的成员函数,调用它不需要参数。

语法格式

size_type capacity() const;

参数说明

  • 参数: 无参数
    • capacity 不接受任何参数。

函数说明

  • 返回值: 返回 size_type 类型(通常是 size_t),表示容器当前分配的存储空间能够容纳的元素数量。
  • 效果: 返回一个非负整数,表示容器已分配的内存空间。
  • 注意capacity() 返回的是容量,不是元素个数。元素个数使用 size() 获取。

实例

让我们通过一系列例子,彻底掌握 capacity 的用法。

示例 1:基础用法 - 查看容量

实例

#include <iostream>
#include <vector>

int main() {
    // 空 vector
    std::vector<int> emptyVec;
    std::cout << "空 vector - size: " << emptyVec.size()
              << ", capacity: " << emptyVec.capacity() << std::endl;

    // 有元素的 vector
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::cout << "5 元素 vector - size: " << numbers.size()
              << ", capacity: " << numbers.capacity() << std::endl;

    return 0;
}

运行结果预期:

空 vector - size: 0, capacity: 0
5 元素 vector - size: 5, capacity: 5

代码解析:

  1. 空 vector 的 capacity() 是 0。
  2. 有 5 个元素的 vector,capacity() 至少是 5(可能更大,取决于实现)。

示例 2:size 与 capacity 的关系

理解 sizecapacity 的区别是优化 vector 使用的基础。

实例

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;

    // 逐渐添加元素,观察容量变化
    std::cout << "添加元素过程中 size 和 capacity 的变化:" << std::endl;

    for(int i = 0; i < 15; ++i) {
        v.push_back(i);
        std::cout << "添加 " << (i + 1) << " 个元素后 - size: "
                  << v.size() << ", capacity: " << v.capacity() << std::endl;
    }

    return 0;
}

运行结果预期(典型输出):

添加元素过程中 size 和 capacity 的变化:
添加 1 个元素后 - size: 1, capacity: 1
添加 2 个元素后 - size: 2, capacity: 2
添加 3 个元素后 - size: 3, capacity: 4
添加 4 个元素后 - size: 4, capacity: 4
添加 5 个元素后 - size: 5, capacity: 8
添加 6 个元素后 - size: 6, capacity: 8
添加 7 个元素后 - size: 7, capacity: 8
添加 8 个元素后 - size: 8, capacity: 8
添加 9 个元素后 - size: 9, capacity: 16
添加 10 个元素后 - size: 10, capacity: 16
添加 11 个元素后 - size: 11, capacity: 16
添加 12 个元素后 - size: 12, capacity: 16
添加 13 个元素后 - size: 13, capacity: 16
添加 14 个元素后 - size: 14, capacity: 16
添加 15 个元素后 - size: 15, capacity: 16

代码解析:

  • vector 的容量以指数方式增长(通常是 2 倍)。
  • 当容量不足时,vector 会分配更大的内存空间(通常是当前容量的 2 倍)。
  • 这种策略是为了减少内存重新分配的次数,提高性能。

示例 3:使用 reserve 预分配容量

使用 reserve 可以预先分配足够的容量,避免频繁的内存重新分配。

实例

#include <iostream>
#include <vector>

int main() {
    // 预分配 1000 个元素的容量
    std::vector<int> v;
    v.reserve(1000);

    std::cout << "reserve(1000) 后 - size: " << v.size()
              << ", capacity: " << v.capacity() << std::endl;

    // 添加 100 个元素
    for(int i = 0; i < 100; ++i) {
        v.push_back(i);
    }

    std::cout << "添加 100 个元素后 - size: " << v.size()
              << ", capacity: " << v.capacity() << std::endl;

    return 0;
}

运行结果预期:

reserve(1000) 后 - size: 0, capacity: 1000
添加 100 个元素后 - size: 100, capacity: 1000

代码解析:

  • reserve(1000) 预先分配了能容纳 1000 个元素的内存空间。
  • 添加 100 个元素后,capacity 仍然是 1000,没有发生内存重新分配。
  • 这可以显著提高性能,特别是当需要添加大量元素时。

示例 4:shrink_to_fit 释放多余容量

C++11 引入了 shrink_to_fit 方法,可以将容量调整为与 size 相同。

实例

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;

    // 添加 5 个元素
    for(int i = 0; i < 5; ++i) {
        v.push_back(i);
    }

    std::cout << "初始状态 - size: " << v.size()
              << ", capacity: " << v.capacity() << std::endl;

    // 预留更多空间
    v.reserve(100);
    std::cout << "reserve(100) 后 - size: " << v.size()
              << ", capacity: " << v.capacity() << std::endl;

    // 收缩到合适大小
    v.shrink_to_fit();
    std::cout << "shrink_to_fit() 后 - size: " << v.size()
              << ", capacity: " << v.capacity() << std::endl;

    return 0;
}

运行结果预期:

初始状态 - size: 5, capacity: 5
reserve(100) 后 - size: 5, capacity: 100
shrink_to_fit() 后 - size: 5, capacity: 5

代码解析:

  • shrink_to_fit() 请求容器将容量减少到与 size 相同。
  • 这可以释放不再需要的内存。
  • 注意:这不是强制要求,具体的容量取决于实现。

示例 5:capacity 的实际应用

了解 capacity 可以帮助优化内存使用。

实例

#include <iostream>
#include <vector>

void printStatus(const std::string& operation,
                 const std::vector<int>& v) {
    std::cout << operation << " - size: " << v.size()
              << ", capacity: " << v.capacity() << std::endl;
}

int main() {
    std::vector<int> data;

    printStatus("初始状态", data);

    // 如果我们知道需要存储 1000 个元素,可以预先分配
    const size_t estimatedSize = 1000;
    data.reserve(estimatedSize);

    printStatus("reserve(1000) 后", data);

    // 模拟数据加载
    for(size_t i = 0; i < 1000; ++i) {
        data.push_back(static_cast<int>(i));
    }

    printStatus("添加 1000 个元素后", data);

    // 检查是否需要扩容
    if(data.capacity() < estimatedSize) {
        std::cout << "警告:容量不足!" << std::endl;
    } else {
        std::cout << "容量充足,内存分配次数最少化" << std::endl;
    }

    return 0;
}

运行结果预期:

初始状态 - size: 0, capacity: 0
reserve(1000) 后 - size: 0, capacity: 1000
添加 1000 个元素后 - size: 1000, capacity: 1000
容量充足,内存分配次数最少化

代码解析:

  • 预先估计需要的容量并使用 reserve 可以避免多次内存分配。
  • 这对于处理大量数据的场景特别有用。

C++ 容器类 <vector> C++ 容器类 <vector>