C++ vector 最全入门指南:新手轻松掌握

作为C++开发者,std::vector 是你必须掌握的神器!它就像会自动变大的魔法数组,无论存储游戏角色数据、处理传感器信息还是管理用户输入,都是最佳选择。本文用最易懂的方式,带你20分钟玩转vector!


一、快速入门:创建你的第一个vector

1.1 基础创建方式

#include 

// 方式1:创建空vector(最常用)
std::vector scores;  

// 方式2:创建含初始值的vector(类似数组初始化)
std::vector names {"Alice", "Bob", "Charlie"}; 

// 方式3:创建10个元素的vector(默认初始化为0)
std::vector temperatures(10); 

// 方式4:创建5个值为100的vector(适合初始化默认值)
std::vector healthPoints(5, 100); 

1.2 新手常见误区

  • vector v(5);vector v{5}; 的区别
  • 前者创建5个0,后者创建1个5
  • ✅ 优先使用 {} 初始化(避免歧义)

二、核心操作:增删查改

2.1 添加元素(重点掌握)

// 尾部添加元素(最常用)
scores.push_back(90);     // 拷贝方式添加(适合基本类型)
names.emplace_back("Tom"); // 直接构造(推荐用于对象)

// 中间插入元素(慎用,效率较低)
scores.insert(scores.begin() + 1, 85); // 在第二个位置插入85

2.2 删除元素

scores.pop_back();        // 删除最后一个元素(O(1)时间)

// 删除第二个元素(效率较低)
scores.erase(scores.begin() + 1); 

// 清空所有元素(保留内存)
scores.clear();           

2.3 访问元素(安全第一)

// 最常用方式
std::cout << names[0];      // 不检查越界(类似数组)
std::cout << names.at(2);   // 会检查越界(推荐新手使用)

// 获取首尾元素(不用记索引)
std::cout << scores.front(); // 等价scores[0]
std::cout << scores.back();  // 等价scores[size-1]

三、实用技巧:遍历与容量

3.1 遍历vector(三种方式)

// 方式1:传统for循环(可控制索引)
for(int i=0; i

3.2 容量管理(性能关键)

std::cout << "当前元素个数:" << scores.size();
std::cout << "最大容量:" << scores.capacity();

// 提前预留空间(避免反复扩容)
scores.reserve(1000);  // 预分配1000个元素的内存

// 调整元素数量(多出的默认初始化)
scores.resize(20);     // 小于当前size会截断

四、避坑指南:常见问题解答

Q1:vector会自己释放内存吗?

  • 会,但实际内存由vector对象生命周期控制
  • 立即释放技巧:
    std::vector().swap(scores); // 与空vector交换
    // 或 C++11+
    scores.shrink_to_fit(); 
    

Q2:vector可以作为函数参数吗?

  • 可以!三种常用方式:
    void Print1(const std::vector& v); // 只读引用(推荐)
    void Print2(std::vector v);        // 值拷贝(耗资源)
    void Modify(std::vector& v);       // 可修改引用
    

Q3:存储自定义对象?

  • 需要对象支持拷贝构造
    class Player {
    public:
        Player(std::string name) : name_(name) {}
    private:
        std::string name_;
    };
    
    std::vector players;
    players.emplace_back("Hero"); // 直接构造对象
    

五、性能优化(进阶技巧)

5.1 预分配内存

// 坏例子:每次扩容都要复制元素
std::vector bad_vec;
for(int i=0; i<10000; ++i) {
    bad_vec.push_back(i); // 多次扩容!
}

// 好例子:一次性预分配
std::vector good_vec;
good_vec.reserve(10000);  // 预先申请内存
for(int i=0; i<10000; ++i) {
    good_vec.push_back(i); // 无需扩容
}

5.2 移动语义(C++11+)

std::vector getData() {
    std::vector temp {"a", "b", "c"};
    return temp; // 自动转为移动语义(不复制数据)
}

// 调用方高效获取
std::vector data = getData(); 

六、总结:一张图看懂vector

1. 添加元素
方法/操作 时间复杂度 特性说明
push_back(val) 均摊 O(1) 尾部插入元素,可能触发扩容
emplace_back(args...) 均摊 O(1) 直接构造元素,避免拷贝(推荐优先使用)
insert(pos, val) O(n) 在迭代器位置插入元素(可能使迭代器失效)
emplace(pos, args...) O(n) 在指定位置直接构造元素
2. 删除元素
方法/操作 时间复杂度 特性说明
pop_back() O(1) 删除最后一个元素
erase(pos) O(n) 删除指定位置元素
erase(begin, end) O(n) 删除区间元素
clear() O(n) 清空容器(不释放内存)

 

3. 元素访问
访问方式 特性说明
operator[] 无边界检查(O(1))
at(index) 带边界检查(越界抛出异常)
front()/back() 访问首/尾元素
data() 获取底层数组指针(C++11+)
三、容量管理
方法/属性 功能描述
size() 当前元素数量
capacity() 当前分配的内存容量
empty() 判断容器是否为空
reserve(n) 预分配内存(避免多次扩容)
resize(n) 调整元素数量(新增元素默认初始化)
resize(n, val) 调整元素数量并用 val 初始化新元素

 

你可能感兴趣的:(C++ vector 最全入门指南:新手轻松掌握)