向量
向量是可以在添加或删除元素时自动调整大小的动态数组。它们是 C++ 中最常用的容器之一,提供了动态内存分配的灵活性以及连续内存存储的性能优势。
C++ 标准模板库 (STL) 提供了一个强大的 vector 类,它自动处理内存管理,比手动动态数组更安全、更便捷,同时保持出色的性能。
向量基础
向量可以通过多种方式初始化,并支持各种数据类型:
创建和初始化向量
#include <iostream>
#include <vector>
using namespace std;
int main() {
// Different ways to create vectors
vector<int> numbers1; // Empty vector
vector<int> numbers2(5); // 5 elements, all initialized to 0
vector<int> numbers3(5, 10); // 5 elements, all initialized to 10
vector<int> numbers4 = {1, 2, 3, 4, 5}; // Initialize with values
vector<int> numbers5(numbers4); // Copy constructor
// Display vector contents
cout << "numbers1 (empty): ";
for (int num : numbers1) cout << num << " ";
cout << "Size: " << numbers1.size() << endl;
cout << "numbers2 (5 zeros): ";
for (int num : numbers2) cout << num << " ";
cout << "Size: " << numbers2.size() << endl;
cout << "numbers3 (5 tens): ";
for (int num : numbers3) cout << num << " ";
cout << "Size: " << numbers3.size() << endl;
cout << "numbers4 (1-5): ";
for (int num : numbers4) cout << num << " ";
cout << "Size: " << numbers4.size() << endl;
// Vector of strings
vector<string> fruits = {"apple", "banana", "orange"};
cout << "\nFruits: ";
for (const string& fruit : fruits) {
cout << fruit << " ";
}
cout << endl;
return 0;
}添加和删除元素
向量在需要时会自动调整大小。常见操作包括 push_back()、insert()、pop_back() 和 erase():
动态调整大小操作
#include <iostream>
#include <vector>
using namespace std;
void printVector(const vector<int>& vec, const string& label) {
cout << label << ": ";
for (int val : vec) cout << val << " ";
cout << "(size: " << vec.size() << ", capacity: " << vec.capacity() << ")" << endl;
}
int main() {
vector<int> numbers;
cout << "=== Adding Elements ===" << endl;
printVector(numbers, "Initial");
// Adding elements to the end
numbers.push_back(10);
printVector(numbers, "After push_back(10)");
numbers.push_back(20);
numbers.push_back(30);
printVector(numbers, "After adding 20, 30");
// Insert at specific position
numbers.insert(numbers.begin() + 1, 15);
printVector(numbers, "After insert 15 at index 1");
cout << "\n=== Removing Elements ===" << endl;
// Remove last element
numbers.pop_back();
printVector(numbers, "After pop_back()");
// Remove at specific position
numbers.erase(numbers.begin() + 1);
printVector(numbers, "After erasing index 1");
// Clear all elements
numbers.clear();
printVector(numbers, "After clear");
return 0;
}向量迭代器
迭代器提供了遍历向量元素的方法,对于许多 STL 算法来说是必不可少的:
使用迭代器
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> numbers = {5, 2, 8, 1, 9, 3};
// Using iterators to traverse
cout << "Forward iteration: ";
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
cout << *it << " ";
}
cout << endl;
// Reverse iteration
cout << "Reverse iteration: ";
for (auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
cout << *it << " ";
}
cout << endl;
// Using algorithms with iterators
sort(numbers.begin(), numbers.end());
cout << "After sorting: ";
for (int num : numbers) cout << num << " ";
cout << endl;
// Find element
auto found = find(numbers.begin(), numbers.end(), 5);
if (found != numbers.end()) {
cout << "Found 5 at position: " << distance(numbers.begin(), found) << endl;
}
return 0;
}性能考虑
了解向量的性能特征有助于编写高效的代码:
- 随机访问:O(1) - 通过索引访问元素是常数时间
- 末尾插入/删除:平均 O(1) - push_back 和 pop_back 非常高效
- 中间插入/删除:O(n) - 需要移动元素
- 内存:连续存储提供缓存友好的访问模式