【std::vector】clear介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

      • [`std::vector::clear()` 详细说明](#std::vector::clear() 详细说明)
        • [1. 核心功能](#1. 核心功能)
        • [2. 对 size 和 capacity 的具体影响](#2. 对 size 和 capacity 的具体影响)
        • [3. 代码示例](#3. 代码示例)
        • [4. 补充说明](#4. 补充说明)
      • 总结

你想了解C++标准库中std::vectorclear()成员函数的功能,并且重点关注这个函数是对size生效,还是对capacity生效。

std::vector::clear() 详细说明

1. 核心功能

clear()的作用是销毁vector中所有的元素 ,并将vector元素数量(size)置为 0 ,但不会释放 vector 已经分配的内存空间(即不改变容量 capacity)。

2. 对 size 和 capacity 的具体影响
  • 对 size 的影响clear() 会直接将 vectorsize() 返回值变为 0,因为容器内的所有元素都被销毁了,当前有效元素的数量为 0。
  • 对 capacity 的影响clear() 完全不影响 capacity() 的返回值,容器之前分配的内存空间会被保留,不会被释放。
3. 代码示例

下面的代码可以直观展示 clear()sizecapacity 的影响:

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    // 创建一个vector并添加元素
    std::vector<int> vec = {1, 2, 3, 4, 5};
    
    std::cout << "调用clear()前:" << std::endl;
    std::cout << "size: " << vec.size() << std::endl;     // 输出 5(当前元素数量)
    std::cout << "capacity: " << vec.capacity() << std::endl; // 输出 5(分配的内存能容纳的元素数)

    // 调用clear()清空元素
    vec.clear();

    std::cout << "\n调用clear()后:" << std::endl;
    std::cout << "size: " << vec.size() << std::endl;     // 输出 0(元素已清空)
    std::cout << "capacity: " << vec.capacity() << std::endl; // 输出 5(内存仍保留)

    // 补充:如果想同时清空元素并释放内存(改变capacity),可以用swap技巧
    std::vector<int>().swap(vec); // 用空vector交换,释放原有内存
    std::cout << "\nswap后:" << std::endl;
    std::cout << "size: " << vec.size() << std::endl;     // 输出 0
    std::cout << "capacity: " << vec.capacity() << std::endl; // 输出 0(内存已释放)

    return 0;
}
4. 补充说明
  • clear() 只是销毁元素,不会调用 deallocate 释放内存,这样做的目的是为了性能优化:如果后续需要向 vector 中添加新元素,不需要重新分配内存,直接复用原有空间即可。
  • 如果你既想清空元素,又想释放内存(让 capacity 也变为 0),可以使用示例中的 swap 技巧,或者在 C++11 及以上版本中使用 shrink_to_fit()(注意:shrink_to_fit() 是请求式的,编译器不一定会严格执行,但主流编译器都会支持)。

总结

  1. std::vector::clear() 仅对 size 生效,会将 size 置为 0,销毁所有元素;
  2. clear()capacity 无影响,不会释放已分配的内存空间;
  3. 若需清空元素并释放内存,可使用 swapvectorshrink_to_fit()(C++11+)。
相关推荐
_wyt0017 小时前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
玖玥拾10 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you12 小时前
constexpr函数
c++
凡人叶枫12 小时前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++
凡人叶枫12 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
小胖xiaopangss12 小时前
BRpc使用
c++·rpc
-森屿安年-13 小时前
63. 不同路径 II
c++·算法·动态规划
chase_my_dream13 小时前
Cartographer详细讲解
c++·人工智能·自动驾驶
森G13 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
碧海蓝天202213 小时前
C++法则24:在标准 C++ 中,没有任何可移植的方式判断指针 T* pt 指向的内存位置是否已经 构造了对象,程序员必须手动跟踪哪些元素已构造。
java·开发语言·c++