You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用STL无循环将函数应用到std::vector<OBJ>生成std::vector<bool>?

嘿,这事儿用STL里的std::transform就能搞定,完全不用手写循环,算是最贴合需求的简洁方案了~

常规C版本(C11及以上)

首先确保包含<algorithm>和<vector>头文件,然后直接用下面的代码:

#include <algorithm>
#include <vector>

// 假设OBJ是你的自定义类型,foo是已定义好的函数
std::vector<bool> v2;
v2.reserve(v1.size()); // 提前预留空间,避免不必要的扩容
std::transform(v1.begin(), v1.end(), std::back_inserter(v2), foo);

简单解释:

  • std::transform的作用就是遍历输入序列(这里是v1),对每个元素应用指定的函数(foo),然后把结果写入输出序列(v2)。
  • std::back_inserter(v2)是个插入迭代器,会自动把transform生成的结果push_back到v2里,不用手动管理v2的大小。
  • 提前调用reserve是个小优化,因为我们明确知道v2的元素数量和v1一致,预留空间能避免vector动态扩容带来的性能损耗。

更简洁的C++20版本

如果你的项目已经用上了C++20,那可以用范围库(Ranges)的写法,代码更直观:

#include <ranges>
#include <vector>

// C++20及以上适用
auto v2 = v1 | std::views::transform(foo) | std::ranges::to<std::vector<bool>>();

这种管道式的写法可读性拉满:把v1通过transform视图转换成每个元素调用foo后的结果,再直接转换成std::vector<bool>,一行搞定,完全不用操心迭代器或者预留空间的事儿。

小提醒

注意std::vector<bool>是C++标准库中一个特殊的容器(本质是动态bitset),它的元素不是真正的bool类型。如果你的场景需要真正的bool数组(比如要取元素地址),可以考虑用std::vector<char>或者第三方库的boost::dynamic_bitset来替代,但如果只是存储布尔结果,std::vector<bool>完全够用。

内容的提问来源于stack exchange,提问作者rwst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:27:51