如何用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
相关产品推荐
相关产品推荐

