在上篇中,我们讨论了C++ STL中的vector
类的基本使用方法,包括如何定义、初始化和基本操作。在本篇中,我们将深入探讨vector
的高级功能,包括动态扩展、内存管理、迭代器使用以及常见的应用场景。
1. 动态扩展
vector
的一个重要特点是能够动态扩展其大小。当我们向vector
中添加元素时,vector
会自动处理内存的分配和释放。
1.1 添加元素
我们可以使用push_back
方法在vector
的末尾添加元素。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers;
for (int i = 1; i <= 5; ++i) {
numbers.push_back(i); // 动态添加元素
}
std::cout << "Numbers: ";
for (const auto& num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
1.2 扩展与缩减
当添加的元素超出当前容量时,vector
会自动扩展其容量,通常是当前容量的两倍。当使用resize
方法时,我们可以直接调整vector
的大小。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3};
numbers.resize(5); // 扩展到5个元素
numbers[3] = 4;
numbers[4] = 5;
std::cout << "Resized Numbers: ";
for (const auto& num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
2. 内存管理
vector
自动管理内存的分配和释放,但我们仍需注意内存使用的效率。
2.1 容量管理
使用capacity
和size
方法可以获取当前的元素个数和已分配的容量。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers;
numbers.reserve(10); // 提前分配10个元素的空间
std::cout << "Capacity: " << numbers.capacity() << std::endl;
std::cout << "Size: " << numbers.size() << std::endl;
return 0;
}
2.2 清空与释放
使用clear
方法可以清空vector
中的元素,使用shrink_to_fit
可以释放未使用的内存。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
numbers.clear(); // 清空元素
std::cout << "Size after clear: " << numbers.size() << std::endl;
numbers.shrink_to_fit(); // 释放内存
std::cout << "Capacity after shrink: " << numbers.capacity() << std::endl;
return 0;
}
3. 迭代器使用
vector
支持多种类型的迭代器,包括随机访问迭代器。
3.1 使用迭代器遍历
通过begin
和end
方法,可以获取vector
的迭代器,并遍历其元素。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "Numbers using iterator: ";
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
3.2 反向迭代器
使用rbegin
和rend
方法,可以使用反向迭代器从后向前遍历。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "Numbers in reverse: ";
for (auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
4. 应用场景
vector
广泛用于各种应用中,适合需要动态大小数组的场景,如:
- 动态数据集合:需要频繁增加或减少元素的情况下,
vector
非常高效。 - 存储计算结果:在需要存储计算结果并动态更新的算法中,
vector
是理想的选择。 - 实现栈和队列:利用
vector
的灵活性,可以简单地实现栈(使用push_back
和pop_back
)或队列(使用push_back
和erase
)。
5. 总结
在本篇中,我们深入探讨了C++ STL中的vector
类的动态扩展、内存管理、迭代器使用以及常见的应用场景。通过对这些高级功能的掌握,你将能够更加高效地利用vector
进行各种编程任务。继续实践和深入学习,你将能够运用vector
解决更复杂的问题。