C++使用numeric

C++使用numeric

std::iota

以起始值的连续增量填充一个范围

  • 就地填充:直接修改容器中的元素
  • 连续递增:从指定值开始,依次递增赋值
  • 要求类型支持T 必须支持前缀 ++ 操作符
  • 迭代器要求:至少是前向迭代器(ForwardIterator)
cpp 复制代码
int main() {
	system("chcp 65001");

	// 1. 填充 vector,从1开始
	std::vector<int> vec(5);
	std::iota(vec.begin(), vec.end(), 1);
	for (int x : vec) {
		std::cout << x << ", ";
	}
	std::cout << endl;

	// 2. 填充数组,从10开始
	int arr[5];
	std::iota(std::begin(arr), std::end(arr), 10);
	for (int x : arr) {
		std::cout << x << ", ";
	}
	std::cout << endl;

	// 求和
	int sum = std::accumulate(std::begin(arr), std::end(arr), 0);
	std::cout << "sum: " << sum << endl;

	// 过滤
	auto result1 = arr | std::views::filter([](int x) { return x % 2 == 0; })
		| std::views::transform([](int x) { return x * x; });
	for (int item : result1) {
		std::cout << item << ", ";
	}
	std::cout << endl;

	return 0;
}

std::ranges::iota

std::ranges::iota 是 C++23 引入的算法 ,用于将递增的值填充到范围中。它等价于传统的 std::iota,但使用了 C++20 的范围(Ranges)接口

  • 范围友好: 支持直接传入范围对象
  • 类型安全: 编译时概念约束确保类型兼容性
  • 信息丰富: 返回最终状态信息
  • 性能优秀: 线性时间复杂度,常数空间开销
  • 向后兼容: 仍然支持传统的迭代器接口
特性 std::iota (C++11) std::ranges::iota (C++23)
头文件 <numeric> <numeric>
参数 迭代器对 + 初始值 范围/迭代器对 + 初始值
返回值 void iota_result 结构体
范围支持 原生支持范围
约束检查 运行时 编译时概念约束
cpp 复制代码
int main() {
	system("chcp 65001");

	// 1. 填充 vector,从1开始
	std::vector<int> vec(5);
	std::ranges::iota(vec, 1);
	for (int x : vec) {
		std::cout << x << ", ";
	}
	std::cout << endl;

	// 2. 填充数组,从10开始
	int arr[5];
	std::ranges::iota(arr, 10);
	for (int x : arr) {
		std::cout << x << ", ";
	}
	std::cout << endl;

	// 求和
	int sum = std::accumulate(std::begin(arr), std::end(arr), 0);
	std::cout << "sum: " << sum << endl;

	// 过滤
	auto result1 = arr | std::views::filter([](int x) { return x % 2 == 0; })
		| std::views::transform([](int x) { return x * x; });
	for (int item : result1) {
		std::cout << item << ", ";
	}
	std::cout << endl;

	return 0;
}

std::accumulate

对一个序列中的所有元素,按顺序进行累积计算,最终返回一个单一结果

cpp 复制代码
int main() {
	system("chcp 65001");

	std::vector<int> numbers = { 1, 2, 3, 4, 5 };
	// 求和
	int result = std::accumulate(numbers.begin(), numbers.end(), 0);
	std::cout << "Sum: " << result << endl;

	// 使用 fold_left(等价于 accumulate)
	result = std::ranges::fold_left(numbers, 0, std::plus{});
	std::cout << "Sum: " << result << endl;

	// 乘法
	result = std::accumulate(numbers.begin(), numbers.end(), 1, std::multiplies{});
	std::cout << "Sum: " << result << endl;

	result = std::ranges::fold_left(numbers, 1, std::multiplies{});
	std::cout << "Sum: " << result << endl;

	// 拼接
	auto line = std::accumulate(numbers.begin(), numbers.end(), std::string{}, [](std::string a, int b) {return a + std::to_string(b); });
	std::cout << "result: " << line << endl;

	auto words = numbers | std::views::transform([](int it) {return std::to_string(it); });
	line = std::accumulate(words.begin(), words.end(), std::string{});
	std::cout << "result: " << line << endl;

	line = std::ranges::fold_left(numbers, std::string{}, [](std::string a, int b) {return a + std::to_string(b); });
	std::cout << "Sum: " << line << endl;

	return 0;
}

std::reduce

一个并行友好的折叠算法 ,用于对序列进行累积计算,与 std::accumulate 的关键区别在于:

  • 不要求操作顺序(可并行执行)
  • 要求操作满足结合律和交换律
  • 可能比 accumulate 更快(尤其在并行执行时)
特性 std::accumulate std::reduce
执行顺序 严格从左到右 任意顺序(可并行)
操作要求 无特殊要求 必须满足结合律 + 交换律
并行支持 ❌ 不支持 ✅ 支持(通过执行策略)
性能 稳定但串行 可能更快(并行时)
默认操作 加法 加法
相关推荐
南极星100526 分钟前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言
baidu_2474386130 分钟前
Android ViewModel定时任务
android·开发语言·javascript
CSDN_RTKLIB32 分钟前
【四个场景测试】源文件编码UTF-8 BOM
c++
Dev7z42 分钟前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab
不能隔夜的咖喱1 小时前
牛客网刷题(2)
java·开发语言·算法
小天源1 小时前
Error 1053 Error 1067 服务“启动后立即停止” Java / Python 程序无法后台运行 windows nssm注册器下载与报错处理
开发语言·windows·python·nssm·error 1053·error 1067
肉包_5111 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
大空大地20262 小时前
流程控制语句--if语句
开发语言
毕设源码-邱学长2 小时前
【开题答辩全过程】以 基于PHP的发热病人管理平台的设计与实现为例,包含答辩的问题和答案
开发语言·php
Trouvaille ~2 小时前
【Linux】UDP Socket编程实战(一):Echo Server从零到一
linux·运维·服务器·网络·c++·websocket·udp