【发布时间】:2019-03-01 04:56:58
【问题描述】:
如果我有类似的东西:
vector<int> longVector = { ... };
vector<int> newVector;
transform(longVector.begin(), longVector.end(), back_inserter(newVector),
[] (int i) { return i * i; });
STL 是否能够在处理和添加新元素之前在newVector 中预先分配空间?我知道这不是算法的要求,但是“好的”实现能够优化它吗?或者,对于这种情况,我应该更喜欢在之前添加newVector.reserve(longVector.size()); 吗?我不一定要问每个 stdlib 实现是否存在(尽管如果有人知道具体的例子会很棒),但更多的是考虑到算法的接口和要求,它是否可能(并且是预期的)。
这个问题适用于多种 STL 算法,transform、copy、move、fill_n、……我想不仅适用于back_inserter,还适用于front_inserter 和inserter。
编辑:为了清楚起见,我的意思是 stdlib 是否可以提供特定实现,例如,transform,对于输出迭代器是 back_inserter 或 vector 的情况,在这种情况下它在实际运行转换之前,将访问向量对象并保留足够的空间来存储给定迭代器对之间的distance。
【问题讨论】:
-
reserve是你的朋友。 -
back_insert_iterator只是打电话给push_back,恕我直言。 -
当然可以,为什么不呢?
-
@DanM。我想它将通过基于两种迭代器类型的标签调度来实现,这是零运行时成本
-
@DanM。这里的想法是在算法开始时根据迭代器之间的距离,而不是循环中的多次调用,对每个
transform进行一次调用reserve。标签调度将用于在编译时“决定”是否应该调用此reserve。不知道为什么reserve应该被认为是“不安全的”(或者比push_back更“不安全”)。
标签: c++ memory stl stdvector stl-algorithm