jde*_*esa 5 c++ memory stl stdvector stl-algorithm
如果我有类似的东西:
vector<int> longVector = { ... };
vector<int> newVector;
transform(longVector.begin(), longVector.end(), back_inserter(newVector),
[] (int i) { return i * i; });
Run Code Online (Sandbox Code Playgroud)
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()
,我觉得任何实现者都不太可能实现这样的事情。特别是因为它可能需要std::?distance()
输入迭代器才能工作,进一步限制了它的使用。
另请注意,此类实现需要在其迭代器中保留对拥有向量的引用,并且无法使用 的最常见表示形式std::?vector<T>::?iterator
,即T*
。这是所有用户都必须承担的成本,无论是否使用此新功能。
技术上可行吗?也许,在某些情况下。允许吗?我想是这样。良好的工作价值?不。
归档时间: |
|
查看次数: |
344 次 |
最近记录: |