向量

向量是可以在添加或删除元素时自动调整大小的动态数组。它们是 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) - 需要移动元素
  • 内存:连续存储提供缓存友好的访问模式