询问STL中是否存在替代自定义copy_access的容器转换算法
用STL的
std::transform替代自定义的copy_acces函数 当然有啦!你要找的这种“将容器中类类型元素提取成员,转换为另一种类型容器”的功能,STL标准库早就提供了现成的解决方案——std::transform,它完美匹配你的需求,完全可以替代你自定义的copy_acces函数。
为什么std::transform适用?
std::transform的核心作用就是遍历一个输入序列,对每个元素应用指定的操作(比如提取类成员),然后将结果写入目标输出序列。它的参数设计和你写的copy_acces几乎一致:
- 输入迭代器的首尾范围
- 输出迭代器的起始位置
- 用于转换元素的操作函数(也就是你的
Accessor)
替换后的代码示例
把你原来的代码改成用std::transform的版本,会更简洁且符合STL规范:
#include <algorithm> #include <vector> #include <iostream> #include <iterator> // 用于back_inserter using namespace std; struct A { int i; }; int main() { vector<A> vecA = {{0}, {1}, {2}}; vector<int> vecInt; // 用std::transform替代自定义copy_acces transform(vecA.begin(), vecA.end(), back_inserter(vecInt), [](const A& a){ return a.i; }); for(int i : vecInt) { cout << i << endl; } }
几个小细节优化
- 这里用
back_inserter(vecInt)替代了你原来写的back_insert_iterator<vector<int>>(vecInt),它是back_insert_iterator的便捷别名,写起来更简洁,功能完全一样。 - lambda表达式的参数用
const A&而不是值传递A a,可以避免不必要的类对象拷贝,尤其是当你的类比较大的时候,能显著提升性能——这是STL使用的最佳实践哦。 std::transform还支持二元操作(比如合并两个输入序列的元素),功能比你的自定义函数更强大,但单参数场景刚好完全匹配你的需求。
内容的提问来源于stack exchange,提问作者exilit
相关产品推荐
相关产品推荐

