Vector的介绍

Vector的基本介绍

  • Vector类的定义说明
    public class Vector
    extends AbstractList
    implement List,RandomAccess,Cloneable,Serializable
  • Vector底层也是一个对象数组 protected Object[] elementDate;
  • Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized
  • 在开发中,需要线程同步安全时,考虑Vector
public class Vector_ {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        Vector vector = new Vector();
        for (int i = 0; i < 10; i++) {
            vector.add(i);
        }
        System.out.println(vector);
        Vector vector1 = new Vector(8);
        for (int j = 0; j < 10; j++) {
            vector1.add(j);
        }
        System.out.println(vector1);
    }
}

Vector 和 ArrayList 的比较

在这里插入图片描述

<think> 嗯,用户想要了解C++中vector的详细介绍,并且提供了多个站内引用作为参考。用户可能是正在学习C++的开发者,或者需要复习vector相关知识。 从引用内容看,用户提供的资料已经涵盖了vector的基本概念、初始化方法、容量管理等核心内容。不过用户要求的是"详细介绍",这意味着需要更系统地组织这些信息,并补充引用中未提及的重要特性。 用户特别标注了"不是真正需求",说明ta更希望获得全面专业的解释而非简单重复引用内容。考虑到C++的vector是基础但重要的容器,应该重点突出几个维度: 1 核心特性(动态数组、自动扩容) 2 初始化方式(不同版本的语法差异) 3 内存管理机制(size/capacity关系) 4 常用操作复杂度 注意到引用[3]提到capacity的设计原理,这点很重要但常被初学者忽略,应该展开说明。另外引用[2]提到的C++11初始化方式需要特别标注版本限制。 用户没有指定C++版本,但引用中出现了C++11特性,所以采用兼容性说明更稳妥。在示例代码部分要避免使用auto等可能不兼容的特性。 需要警惕引用[2]中"v5(a,a+5)"的写法存在陷阱——当数组元素不足5个时会越界,这个隐患必须在示例中明确指出。另外"vector<int> v{10}"的初始化方式容易与圆括号混淆,要用对比表格强化认知。 最后考虑用户可能是为了实际开发使用,补充reserve()的预分配策略这个实用技巧会很有价值。性能分析部分要强调扩容代价,这是vector最关键的优化点。 </think>以下是对C++标准库中`vector`容器的详细介绍,结合其核心特性、使用方法和注意事项: --- ### **一、基本概念** 1. **动态数组** `vector`是**顺序容器**,在内存中连续存储元素,支持随机访问(时间复杂度$O(1)$)。 2. **自动扩容** 当元素数量超过当前容量(`capacity()`)时,自动重新分配更大内存(通常扩容至原容量1.5或2倍),原有迭代器失效[^3]。 --- ### **二、初始化方式** | **语法** | **说明** | |-----------------------------------|--------------------------------------------------------------------------| | `vector<T> v1;` | 创建空容器 | | `vector<T> v2(n);` | 创建含`n`个元素的容器,元素值为`T()`(如`int`默认为0) | | `vector<T> v3(n, value);` | 创建含`n`个值为`value`的元素的容器 | | `vector<T> v4(v1);` | 拷贝构造(深拷贝) | | `vector<T> v5 = {a,b,c,...};` | 列表初始化(C++11起支持) | | `vector<T> v6(arr, arr+k);` | 用数组`arr[0]`到`arr[k-1]`初始化 | > 💡 示例: > ```cpp > vector<int> v1; // 空容器 > vector<int> v2(5); // {0,0,0,0,0} > vector<int> v3(3, 9); // {9,9,9} > vector<int> v4 = {1,3,5}; // 列表初始化 > int arr[] = {2,4,6}; > vector<int> v5(arr, arr+3); // {2,4,6} > ``` --- ### **三、核心操作** #### 1. **元素访问** | 方法 | 说明 | 越界检查 | |---------------------|----------------------------------|----------| | `v[i]` | 访问索引`i`的元素 | ❌ 无 | | `v.at(i)` | 访问索引`i`的元素 | ✅ 有 | | `v.front()` | 首元素 | - | | `v.back()` | 尾元素 | - | #### 2. **容量管理** | 方法 | 说明 | |-----------------------|---------------------------------------------| | `v.size()` | 返回当前元素数量 | | `v.capacity()` | 返回当前分配的内存可容纳的元素数 | | `v.empty()` | 判断容器是否为空 | | `v.reserve(n)` | **预分配**至少容纳`n`个元素的内存(不初始化) | | `v.shrink_to_fit()` | 释放未使用的内存(C++11) | > ⚠️ **扩容机制** > 当`size() == capacity()`时添加新元素,触发扩容: > 1. 分配新内存(通常为原`capacity()`的1.5或2倍) > 2. 拷贝/移动旧元素到新内存 > 3. 释放旧内存 > 此过程使所有迭代器、指针、引用失效[^3]。 #### 3. **修改容器** | 操作 | 说明 | |-----------------------|-------------------------------------------| | `v.push_back(x)` | 尾部插入元素`x` | | `v.pop_back()` | 删除尾部元素 | | `v.insert(iter, x)` | 在迭代器`iter`前插入`x` | | `v.erase(iter)` | 删除迭代器`iter`指向的元素 | | `v.clear()` | 清空容器(不释放内存) | | `v.resize(n)` | 调整元素数量为`n`(多删少补默认值) | --- ### **四、迭代器** | 迭代器类型 | 获取方法 | 用途 | |--------------------|------------------|--------------------------| | 正向迭代器 | `v.begin()` | 指向首元素 | | | `v.end()` | 指向尾元素后一位置 | | 反向迭代器 | `v.rbegin()` | 指向尾元素(反向首元素) | | | `v.rend()` | 指向首元素前位置 | > 示例:遍历元素 > ```cpp > for(auto it = v.begin(); it != v.end(); ++it) { > cout << *it << " "; > } > ``` --- ### **五、性能与注意事项** 1. **时间复杂度** - 随机访问:$O(1)$ - 尾部插入/删除:均摊$O(1)$ - 中间插入/删除:$O(n)$(需移动后续元素) 2. **内存管理建议** - 预分配:若已知元素数量上限,用`reserve()`避免多次扩容开销。 3. **迭代器失效场景** - 插入元素:若触发扩容则**全部失效**;否则**插入点之后**失效。 - 删除元素:**被删元素之后**的迭代器失效。 --- ### **六、代码示例** ```cpp #include <vector> #include <iostream> using namespace std; int main() { vector<int> vec = {7, 5, 16}; // 初始化 vec.push_back(9); // {7,5,16,9} vec.reserve(10); // 预分配10个元素空间 cout << "Size: " << vec.size() // 4 << ", Capacity: " << vec.capacity(); // 10 vec.shrink_to_fit(); // 释放多余内存 return 0; } ``` --- ### **七、适用场景** - 需要频繁随机访问元素 - 主要从尾部添加/删除元素 - 不确定元素数量但需连续存储 - 需兼容C风格数组(`v.data()`返回底层数组指针)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值