C++_Vector用法深入剖析
### C++ Vector 用法深入剖析 #### 一、Vector 的基本概念与使用场景 Vector 是 C++ 标准模板库 (STL) 中的一种容器,它可以被理解为一种能够自动管理内存的动态数组。Vector 支持随机访问,并且在内部通过一个连续的内存空间来存储数据,这使得它在插入、删除操作上不如链表高效,但在访问元素时非常快速。 Vector 在 C++ 编程中的应用非常广泛,尤其适用于需要频繁访问元素但插入和删除操作较少的场景。由于 Vector 可以自动调整大小,因此非常适合处理不确定大小的数据集合。 #### 二、Vector 的创建与初始化 Vector 可以通过多种方式创建和初始化: 1. **空 Vector 的创建**: ```cpp vector<类型> 标识符; ``` 示例: ```cpp vector<int> v1; ``` 2. **指定初始容量**: ```cpp vector<类型> 标识符(最大容量); ``` 示例: ```cpp vector<int> v2(10); // 创建一个初始容量为10的Vector ``` 3. **指定初始容量并初始化所有元素**: ```cpp vector<类型> 标识符(最大容量, 初始值); ``` 示例: ```cpp vector<int> v3(10, 0); // 创建一个初始容量为10,所有元素初始化为0的Vector ``` 4. **从数组中初始化**: ```cpp int arr[] = {1, 2, 3, 4, 5}; vector<类型> vi(arr, arr + sizeof(arr) / sizeof(arr[0])); ``` 示例: ```cpp int i[] = {1, 2, 3, 4, 5}; vector<int> v4(i, i + 2); // 创建一个包含i数组中前两个元素的Vector ``` 5. **多维 Vector 的创建**: ```cpp vector<vector<类型>> vi; ``` 示例: ```cpp vector<vector<int>> v5; // 创建一个二维Vector vector<int> line; for (int i = 0; i < 10; i++) { v5.push_back(line); // 每一行都使用默认初始化的line } ``` #### 三、Vector 的基本操作 - **添加元素**: ```cpp vi.push_back(元素); ``` 示例: ```cpp vector<int> vi; vi.push_back(1); vi.push_back(3); vi.push_back(0); ``` - **排序**: ```cpp sort(vi.begin(), vi.end()); reverse(vi.begin(), vi.end()); ``` 示例: ```cpp vector<int> vi; vi.push_back(1); vi.push_back(3); vi.push_back(0); sort(vi.begin(), vi.end()); // 排序从小到大 reverse(vi.begin(), vi.end()); // 排序从大到小 ``` - **顺序访问**: ```cpp for (int i = 0; i < vi.size(); i++) { cout << vi[i] << " "; } ``` 示例: ```cpp vector<int> vi; for (int i = 0; i < 10; i++) { vi.push_back(i); } for (int i = 0; i < vi.size(); i++) { cout << vi[i] << " "; } ``` - **使用迭代器访问**: ```cpp for (auto it = vi.begin(); it != vi.end(); ++it) { cout << *it << " "; } ``` 示例: ```cpp vector<int> vi; for (int i = 0; i < 10; i++) { vi.push_back(i); } for (auto it = vi.begin(); it != vi.end(); ++it) { cout << *it << " "; } ``` - **查找元素**: ```cpp auto it = find(vi.begin(), vi.end(), 元素); if (it != vi.end()) { cout << "找到元素: " << *it << endl; } ``` 示例: ```cpp vector<int> vi; for (int i = 0; i < 10; i++) { vi.push_back(i); } auto it = find(vi.begin(), vi.end(), 3); if (it != vi.end()) { cout << "找到元素: " << *it << endl; } ``` #### 四、结构体类型与 Vector 的结合 Vector 不仅可以用于基本数据类型,还可以用于自定义类型,例如结构体。示例代码如下: ```cpp struct Temp { string str; int id; }; int main() { vector<Temp> t; Temp w1; w1.str = "Hello world"; w1.id = 1; t.push_back(w1); cout << w1.str << ", " << w1.id << endl; return 0; } ``` #### 五、成员函数详解 Vector 提供了一系列成员函数来辅助其使用: 1. **assign**:`c.assign(beg, end)` 和 `c.assign(n, elem)`。前者用于将 `[beg; end)` 区间中的数据赋值给 c,后者用于将 n 个 elem 的拷贝赋值给 c。 2. **at**:`c.at(idx)` 用于返回索引 idx 所指的数据,如果 idx 越界,则抛出 `out_of_range` 异常。 3. **back**:`c.back()` 用于返回最后一个数据,不检查这个数据是否存在。 4. **begin**:`c.begin()` 用于返回迭代器中的第一个数据地址。 5. **size**:`c.size()` 用于返回容器当前的元素数量。 Vector 作为 C++ 中最常用的容器之一,掌握了以上内容后,对于日常开发中的大部分需求都可以轻松应对。