面试题:C++ 中 vector 的原理?resize 和 reserve 的区别是什么?size 和 capacity 的区别?

std::vector 是 C++ 标准模板库(STL)中最常用的动态数组容器。它的核心特点是支持动态扩容和高效的随机访问。理解 std::vector 的原理以及 resizereservesize 和 capacity 的区别是面试中的常见问题。


1. std::vector 的原理

  • 底层实现std::vector 基于动态数组实现,元素存储在连续的内存空间中。
  • 动态扩容
    • 当元素数量超过当前容量时,std::vector 会分配一块更大的内存(通常是当前容量的 2 倍或 1.5 倍)。
    • 将原有元素拷贝到新内存中,然后释放旧内存。
  • 随机访问:由于元素存储在连续内存中,可以通过下标直接访问元素,时间复杂度为 O(1)

2. resize 和 reserve 的区别

(1)resize

  • 功能:调整 std::vector 的大小(即元素数量)。
  • 行为
    • 如果新的大小大于当前大小,则会在尾部添加默认初始化的元素。
    • 如果新的大小小于当前大小,则会删除尾部的元素。
  • 影响
    • 可能改变 size() 的值。
    • 如果新的大小超过当前容量,会触发内存重新分配。

(2)reserve

  • 功能:调整 std::vector 的容量(即内存空间),但不改变元素数量。
  • 行为
    • 如果新容量大于当前容量,则分配更大的内存空间。
    • 如果新容量小于或等于当前容量,则不做任何操作。
  • 影响
    • 改变 capacity() 的值。
    • 不改变 size() 的值。

3. size 和 capacity 的区别

(1)size

  • 含义:当前 std::vector 中实际存储的元素数量。
  • 返回值size() 返回 std::vector 中元素的数量。

(2)capacity

  • 含义:当前 std::vector 分配的内存空间可以容纳的元素数量。
  • 返回值capacity() 返回 std::vector 的容量。

4. size 和 capacity 的关系

  • size:表示实际存储的元素数量。
  • capacity:表示当前分配的内存空间可以容纳的元素数量。
  • 关系size() <= capacity()

5. 动态扩容的示例

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec;
    for (int i = 0; i < 10; ++i) {
        vec.push_back(i);
        std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;
    }
    return 0;
}

输出:

Size: 1, Capacity: 1
Size: 2, Capacity: 2
Size: 3, Capacity: 4
Size: 4, Capacity: 4
Size: 5, Capacity: 8
Size: 6, Capacity: 8
Size: 7, Capacity: 8
Size: 8, Capacity: 8
Size: 9, Capacity: 16
Size: 10, Capacity: 16

6. 总结

  • resize:调整元素数量,可能改变 size() 和 capacity()
  • reserve:调整容量,只改变 capacity(),不改变 size()
  • size:当前元素数量。
  • capacity:当前分配的内存空间可以容纳的元素数量。

在面试中,理解 std::vector 的动态扩容机制以及 resizereservesize 和 capacity 的区别是非常重要的。

THE END
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容