如何在C++中初始化和遍历vector
发布时间: 2024-05-02 15:38:59 阅读量: 79 订阅数: 42
![如何在C++中初始化和遍历vector](https://img-blog.csdnimg.cn/20210531202043971.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lpaGFuZ19IZQ==,size_16,color_FFFFFF,t_70)
# 1. Vector的基本语法和操作
Vector是C++标准库中的一种动态数组,它可以存储相同类型的元素并自动管理内存分配。Vector具有以下特点:
- 动态大小:Vector的大小可以根据需要自动增长或缩小。
- 连续存储:Vector中的元素在内存中连续存储,因此访问元素非常高效。
- 迭代器支持:Vector支持迭代器,可以方便地遍历元素。
# 2. Vector的初始化和赋值
### 2.1 直接初始化
直接初始化是最简单的一种初始化方式,它直接使用大括号 `{}` 括起来的一组值来初始化一个 Vector。例如:
```cpp
std::vector<int> v1 = {1, 2, 3, 4, 5};
```
这段代码创建了一个包含 5 个整数的 Vector,值分别为 1、2、3、4 和 5。
### 2.2 拷贝初始化
拷贝初始化使用另一个 Vector 或数组来初始化一个新的 Vector。新 Vector 的元素将与原始 Vector 或数组中的元素相同。例如:
```cpp
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<int> v2(v1);
```
这段代码创建了一个新的 Vector `v2`,其内容与 `v1` 相同。
### 2.3 列表初始化
列表初始化使用中括号 `[]` 括起来的一组值来初始化一个 Vector。与直接初始化不同,列表初始化不需要指定 Vector 的类型。例如:
```cpp
std::vector v1 = {1, 2, 3, 4, 5};
```
这段代码创建了一个包含 5 个整数的 Vector,值分别为 1、2、3、4 和 5。
### 2.4 范围初始化
范围初始化使用一对迭代器来初始化一个 Vector。迭代器必须指向同一容器中的元素。例如:
```cpp
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<int> v2(v1.begin(), v1.end());
```
这段代码创建了一个新的 Vector `v2`,其内容与 `v1` 相同。
# 3.1 迭代器遍历
迭代器是 C++ 中一种用于遍历容器的机制。它提供了一种方法来访问容器中的元素,而无需直接访问底层数据结构。对于 Vector,我们可以使用迭代器来遍历容器中的所有元素。
#### 3.1.1 begin() 和 end() 方法
Vector 提供了两个方法来获取迭代器:begin() 和 end()。begin() 方法返回指向容器中第一个元素的迭代器,而 end() 方法返回指向容器中最后一个元素的下一个位置的迭代器。
```cpp
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
// 使用迭代器遍历 Vector
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
cout << *it << " "; // 输出 Vector 中的元素
}
return 0;
}
```
**代码逻辑分析:**
* 创建一个 Vector `v`,并初始化一些值。
* 使用 `begin()` 方法获取指向第一个元素的迭代器。
* 使用 `end()` 方法获取指向最后一个元素的下一个位置的迭代器。
* 使用 `for` 循环遍历迭代器,并输出每个元素的值。
#### 3.1.2 auto 关键字
在 C++11 中,我们可以使用 `auto` 关键字来简化迭代器遍历的代码。`auto` 关键字会自动推断迭代器的类型,从而使代码更加简洁。
```cpp
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
// 使用 auto 关键字简化迭代器遍历
for (auto it = v.begin(); it != v.end(); ++it) {
cout << *it << " "; // 输出 Vector 中的元素
}
return 0;
}
```
**代码逻辑分析:**
* 创建一个 Vector `v`,并初始化一些值。
* 使用 `begin()` 方法获取指向第一个元素的迭代器。
* 使用 `end()` 方法获取指向最后一个元素的下一个位置的迭代器。
* 使用 `for` 循环遍历迭代器,并输出每个元素的值。
使用 `auto` 关键字可以简化代码,因为它会自动推断迭代器的类型。这使得代码更加简洁易读。
# 4. Vector的常见操作
### 4.1 添加和删除元素
Vector提供了多种方法来添加和删除元素,包括:
#### 4.1.1 push_back()和pop_back()方法
* **push_back()方法:**在vector的末尾添加一个元素。
* **pop_back()方法:**删除vector末尾的元素。
**代码示例:**
```cpp
#include <vector>
int main() {
std::vector<int> v;
// 添加元素
v.push_back(10);
v.push_back(20);
v.push_back(30);
// 删除元素
v.pop_back();
return 0;
}
```
**逻辑分析:**
1. `push_back()`方法将元素10、20、30添加到vector的末尾。
2. `pop_back()`方法删除vector末尾的元素,即30。
#### 4.1.2 insert()和erase()方法
* **insert()方法:**在vector的指定位置插入一个或多个元素。
* **erase()方法:**删除vector中指定位置或范围内的元素。
**代码示例:**
```cpp
#include <vector>
int main() {
std::vector<int> v = {10, 20, 30};
// 在指定位置插入元素
v.insert(v.begin() + 1, 15);
// 删除指定位置的元素
v.erase(v.begin() + 2);
return 0;
}
```
**逻辑分析:**
1. `insert()`方法在vector的第二个位置插入元素15。
2. `erase()`方法删除vector中第二个位置的元素,即20。
### 4.2 查找和排序
Vector提供了多种方法来查找和排序元素,包括:
#### 4.2.1 find()和count()方法
* **find()方法:**返回vector中第一个匹配指定值的元素的迭代器。如果未找到,则返回vector的结束迭代器。
* **count()方法:**返回vector中指定值的出现次数。
**代码示例:**
```cpp
#include <vector>
int main() {
std::vector<int> v = {10, 20, 30, 20, 10};
// 查找元素
auto it = std::find(v.begin(), v.end(), 20);
// 计算元素出现次数
int count = std::count(v.begin(), v.end(), 10);
return 0;
}
```
**逻辑分析:**
1. `find()`方法返回第一个匹配值20的元素的迭代器,即指向vector中第二个元素的迭代器。
2. `count()`方法返回值10在vector中出现的次数,即2。
#### 4.2.2 sort()和reverse()方法
* **sort()方法:**对vector中的元素进行排序(默认升序)。
* **reverse()方法:**将vector中的元素反转。
**代码示例:**
```cpp
#include <vector>
int main() {
std::vector<int> v = {30, 10, 20};
// 对元素进行排序
std::sort(v.begin(), v.end());
// 反转元素
std::reverse(v.begin(), v.end());
return 0;
}
```
**逻辑分析:**
1. `sort()`方法将vector中的元素排序为{10, 20, 30}。
2. `reverse()`方法将排序后的vector反转为{30, 20, 10}。
# 5. Vector的进阶应用
### 5.1 Vector的内存管理
Vector在动态分配内存时,可能会存在内存浪费的情况。为了优化内存管理,Vector提供了以下方法:
- **reserve()方法:**
预留指定大小的内存空间。当向Vector中添加元素时,如果剩余空间不足,则会重新分配更大的内存空间。reserve()方法可以避免频繁的内存重新分配,提高效率。
```cpp
vector<int> v;
v.reserve(100); // 预留100个元素的空间
```
- **capacity()方法:**
返回Vector当前分配的内存空间大小。
```cpp
cout << v.capacity() << endl; // 输出Vector分配的内存空间大小
```
- **shrink_to_fit()方法:**
将Vector的内存空间缩减到实际元素数量所需的大小。这可以释放多余的内存空间,减少内存浪费。
```cpp
v.shrink_to_fit(); // 将Vector的内存空间缩减到实际元素数量所需的大小
```
### 5.2 Vector的自定义比较器
在使用Vector进行排序时,默认情况下使用`<`运算符进行比较。为了自定义排序规则,Vector提供了自定义比较器的功能。
- **函数对象:**
函数对象是一种可以被调用并返回一个值的类。我们可以定义一个函数对象,重载`<`运算符,实现自定义的比较逻辑。
```cpp
struct MyComparator {
bool operator()(const int& a, const int& b) {
return a > b; // 降序排序
}
};
```
- **lambda表达式:**
lambda表达式是一种匿名函数,可以方便地定义自定义比较器。
```cpp
vector<int> v = {1, 3, 2, 4, 5};
sort(v.begin(), v.end(), [](const int& a, const int& b) { return a > b; }); // 降序排序
```
0
0