【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+)。
相关推荐
blasit15 分钟前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_1 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星1 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛3 天前
delete又未完全delete
c++
端平入洛4 天前
auto有时不auto
c++
哇哈哈20215 天前
信号量和信号
linux·c++
多恩Stone5 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马5 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝5 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
weiabc5 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法