C++ 迭代器与常用算法

C++ 迭代器与常用算法


一、迭代器(Iterator)
  1. 核心概念

    • 泛化指针,提供类似指针的操作(++, *, ->
    • 统一不同容器的访问方式,实现算法与容器的解耦
    • 分类(功能由弱到强):
      • 输入迭代器(只读)
      • 输出迭代器(只写)
      • 正向迭代器(单向遍历)
      • 双向迭代器(支持双向移动)
      • 随机访问迭代器(支持跳跃访问)
  2. 关键特性

    cpp

    vector<int>::iterator it;  // 随机访问迭代器
    list<int>::iterator lit;   // 双向迭代器
    

二、STL 算法分类
类别 说明 头文件
非可变序列算法 不修改容器内容(如查找、统计)
可变序列算法 修改容器内容(如排序、替换)
排序与搜索算法 排序、二分查找、集合操作
数值算法 数值计算(如累加、内积)

三、核心算法详解
1. 查找算法
算法 功能说明 示例代码片段
count 统计等于指定值的元素个数 count(vec.begin(), vec.end(), 5)
count_if 统计满足条件的元素个数 count_if(vec.begin(), vec.end(), [](int x){return x>3;})
binary_search 有序序列中二分查找 binary_search(arr, arr+size, 4)
find 返回第一个匹配元素的迭代器 auto it = find(vec.begin(), vec.end(), 3);

注意binary_search 要求输入序列已排序。


2. 排序算法
算法 特性说明 使用场景示例
sort 快速排序(默认升序) sort(vec.begin(), vec.end());
stable_sort 稳定排序(保持相等元素顺序) stable_sort(vec.begin(), vec.end(), greater());
nth_element 快速选择第n小元素 nth_element(vec.begin(), vec.begin()+5, vec.end());
partial_sort 部分排序前N个元素 partial_sort(vec.begin(), vec.begin()+3, vec.end());

自定义排序规则

cpp

// 降序排列
sort(vec.begin(), vec.end(), [](int a, int b){return a > b;});

// 使用标准库比较函数
sort(vec.begin(), vec.end(), greater<int>());

3. 删除与替换算法
算法 关键特性 注意事项
remove 逻辑删除(需配合erase物理删除) vec.erase(remove(vec.begin(), vec.end(), 3), vec.end());
replace 替换指定值 replace(vec.begin(), vec.end(), 2, 99);
unique 去重相邻重复元素(需先排序) auto last = unique(vec.begin(), vec.end());
swap 交换两个容器内容 swap(vec1, vec2);

4. 关系算法
算法 功能说明 示例代码
equal 比较两个序列是否相等 equal(vec1.begin(), vec1.end(), vec2.begin());
max_element 返回最大元素的迭代器 auto max_it = max_element(vec.begin(), vec.end());
mismatch 查找首个不匹配元素对 auto p = mismatch(vec1.begin(), vec1.end(), vec2.begin());

5. 遍历算法 for_each

核心用法

cpp

// 使用函数对象
struct Printer {
    void operator()(int x) const { cout << x << " "; }
};
for_each(vec.begin(), vec.end(), Printer());

// 使用Lambda表达式(C++11+)
for_each(vec.begin(), vec.end(), [](int x){cout << x << " ";});

特性

  • 不可修改元素(除非传递引用)
  • 适用于所有提供迭代器的容器

四、最佳实践总结
  1. 迭代器失效:在修改容器时(如erase),注意迭代器可能失效。

算法选择

  • 需要稳定性 → stable_sort
  • 部分排序 → partial_sort/nth_element

性能考虑

  • sort 对小数据量使用插入排序,大数据量使用快速排序
  • remove 系列算法只逻辑删除,需配合erase

C++11+优化

  • 优先使用Lambda表达式替代函数对象
  • 使用auto简化迭代器声明

附:常用头文件

cpp

#include   // 大多数算法
#include     // 数值算法(accumulate, inner_product)
#include  // 函数对象(greater, less)

你可能感兴趣的:(C++学习笔记,算法,c++,开发语言)