当前位置: 首页 > ds >正文

C++学习笔记(三十八)——STL之修改算法

STL 算法分类:

类别常见算法作用
排序sortstable_sortpartial_sortnth_element排序
搜索findfind_ifcountcount_ifbinary_search查找元素
修改copyreplacereplace_ifswapfill修改容器内容
删除removeremove_ifunique删除元素
归约for_eachaccumulate处理数据
合并mergeset_unionset_intersection处理有序序列
排列组合next_permutationprev_permutation生成排列
堆操作push_heappop_heapmake_heapsort_heap处理堆

STL 修改算法

在 C++ 标准库(STL)中,修改算法可以在容器中应用特定的操作,如修改元素的值、替换值、插入新元素等。
修改算法通常返回容器的迭代器,指示修改的位置或结果。

算法名称功能描述时间复杂度空间复杂度适用场景
fill用指定的值填充容器中的所有元素O(n)O(1)填充容器的所有元素
fill_n用指定的值填充容器中的部分元素O(n)O(1)填充容器的部分元素
copy将一个范围内的元素复制到另一个范围中O(n)O(1)将容器中的元素复制到另一个容器
swap交换两个元素的值O(1)O(1)交换两个元素或两个容器的内容
replace替换容器中所有指定值的元素O(n)O(1)替换容器中的指定值
replace_if替换容器中所有满足条件的元素O(n)O(1)根据条件替换容器中的元素
transform对容器中每个元素应用操作并存储结果O(n)O(1)对容器中每个元素进行变换
rotate将给定范围内的元素旋转指定次数O(n)O(1)容器中元素的旋转操作

(1)fill

  • 功能:用指定的值填充容器中的所有元素。
  • 时间复杂度O(n),其中 n 是容器的元素数量。
  • 空间复杂度O(1),原地操作。

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec(5, 0);  // 初始化为5个0fill(vec.begin(), vec.end(), 10);  // 将所有元素修改为10for (int x : vec){cout << x << " ";  // 输出:10 10 10 10 10}cout << endl;system("pause");return 0;
}

注意:

  • fill适用于,当需要用相同的值填充整个容器时。

(2)fill_n

  • 功能:从指定位置开始填充指定数量的元素为给定值。
  • 时间复杂度O(n),其中 n 是填充的元素数量。
  • 空间复杂度O(1),原地操作。

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec(5, 0);fill_n(vec.begin(), 3, 10);  // 将前3个元素填充为10for (int x : vec){cout << x << " ";  // 输出:10 10 10 0 0}cout << endl;system("pause");return 0;
}

注意:

  • fill_n适用于,当需要填充容器的部分元素时。

(3)copy

  • 功能:将一个范围内的元素复制到另一个范围中。
  • 时间复杂度O(n),其中 n 是源范围中的元素数量。
  • 空间复杂度O(1),原地操作。

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> src = { 1, 2, 3, 4, 5 };vector<int> dest(5);// 将 src 中的元素复制到 dest 中copy(src.begin(), src.end(), dest.begin());cout << "复制的vector: ";for (int val : dest) {cout << val << " ";}cout << endl;system("pause");return 0;
}

注意:

  • copy用于将一个容器中的元素复制到另一个容器,或从一个容器复制到数组等。

(4)swap

  • 功能:交换两个变量或容器中的元素。
  • 时间复杂度O(1),它直接交换两个元素,不涉及其他复杂操作。
  • 空间复杂度O(1),原地操作。

示例:

#include <iostream>
using namespace std;
#include <algorithm>int main() {int a = 5, b = 10;// 交换 a 和 b 的值swap(a, b);cout << "a = " << a << ", b = " << b << endl;system("pause");return 0;
}

注意:

  • swap适用于,当需要交换两个元素或两个容器的内容时。

(5)replace

  • 功能:将容器中所有等于指定值的元素替换为新值。
  • 时间复杂度O(n),其中 n 是容器的元素数量。
  • 空间复杂度O(1),原地操作。

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 1, 2, 3, 2, 5 };replace(vec.begin(), vec.end(), 2, 10);  // 将所有2替换为10for (int x : vec){cout << x << " ";  // 输出:1 10 3 10 5}cout << endl;system("pause");return 0;
}

注意:

  • replace适用于,当需要将容器中的指定值替换为其他值时。

(6)replace_if

  • 功能:将容器中所有满足条件的元素替换为新值。
  • 时间复杂度O(n),其中 n 是容器的元素数量。
  • 空间复杂度O(1),原地操作。

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>bool is_odd(int n)
{return n % 2 != 0;
}int main() {vector<int> vec = { 1, 2, 3, 4, 5 };replace_if(vec.begin(), vec.end(), is_odd, 10);  // 将所有奇数替换为10for (int x : vec){cout << x << " ";  // 输出:10 2 10 4 10}cout << endl;system("pause");return 0;
}

注意:

  • replace_if适用于,当需要根据某种条件替换容器中元素时。

(7)transform

  • 功能:对容器中的每个元素应用指定的操作,并将结果存储到目标容器中。
  • 时间复杂度O(n),其中 n 是容器的元素数量。
  • 空间复杂度O(1)

示例:

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int square(int n)
{return n * n;
}int main() {vector<int> vec = { 1, 2, 3, 4, 5 };vector<int> result(vec.size());transform(vec.begin(), vec.end(), result.begin(), square);for (int x : result){cout << x << " ";  // 输出:1 4 9 16 25}cout << endl;system("pause");return 0;
}

注意:

  • transform适用于,当需要对容器中的每个元素进行某些变换时。

(8)rotate

  • 功能:将范围内的元素旋转指定次数(左旋/循环左移)。
  • 时间复杂度O(n),其中 n 是范围中的元素数量。
  • 空间复杂度O(1),原地操作。

示例:

#include <iostream>
#include <algorithm>  // std::rotate
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 将 vec 中的元素旋转 2 次std::rotate(vec.begin(), vec.begin() + 2, vec.end());std::cout << "Rotated vector: ";for (int val : vec) {std::cout << val << " ";}std::cout << std::endl;return 0;
}

注意:

  • rotate适用于,当需要将容器中的元素旋转时。
http://www.xdnf.cn/news/1813.html

相关文章:

  • Python面向对象编程相关的单选题和多选题
  • 服务器部署LLaMAFactory进行LoRA微调
  • 大语言模型的“模型量化”详解 - 03:【超轻部署、极致推理】KTransformers 环境配置 实机测试
  • 蓝桥杯 1. 四平方和
  • Ubuntu主机上通过WiFi转有线为其他设备提供网络连接
  • 【Pandas】pandas DataFrame dot
  • JavaScript性能优化实战(4):异步编程与主线程优化
  • Linux网络编程 深入Linux网络栈:原始套接字链路层实战解析
  • 中式面点实训室建设规划与功能布局方案
  • esp32c3 合宇宙
  • 【FAQ】针对于消费级NVIDIA GPU的说明
  • 驱动安装有感叹号之关闭dell window11 笔记本数字签名
  • Day-3 应急响应实战
  • Java转Go日记(十二):Channel
  • python 练习 二
  • Spring 过滤器详解:从基础到实战应用
  • 算法题(133):二维差分
  • 2025年数字化转型前沿趋势:从数字孪生到认知智能
  • 电力作业安全工器具全解析:分类、配置与检查要点
  • 如何模拟黑客攻击(Red Teaming)以测试服务器安全性
  • istio使用ingress gateway通过header实现对不同服务的路由
  • 软件测试报告核心内容详解(附真实案例模板)
  • SQLPandas刷题(LeetCode3451.查找无效的IP地址)
  • 硬件设计器件选型之②瞬态电压抑制二极管(TVS)
  • Unicode编码
  • 输入捕获模式测频率
  • C++多态(实现部分)(一)
  • 【缓存与数据库结合最终方案】伪从技术
  • ATV Launcher pro下载-ATV Launcher pro全网通用版
  • 4月22日复盘-开始卷积神经网络