如何用range-v3向已预分配空间的容器存入range?
基于range-v3填充已预留空间的vector解决方案
先明确:vector::assign不可靠
你担心的点完全正确——vector::assign(transform.begin(), transform.end())大概率会浪费你提前reserve的空间。因为对于前向迭代器这类无法提前获取元素数量的输入,标准允许vector实现直接销毁现有元素后重新分配内存,不会复用已预留的缓冲区,达不到你想要的内存优化效果。
range-v3的惯用正确写法
range-v3提供了完美适配的方案,用ranges::copy(range-v3实现的版本)配合back_inserter,既能遵循range的链式风格,又能保证利用提前预留的空间:
auto src = GetForwardIteratorRange(); auto transformed = src | rv::transform([](auto item) { /* 你的转换逻辑 */ }); vector<YourElementType> dest; dest.reserve(100'000); ranges::copy(transformed, back_inserter(dest));
如果喜欢更紧凑的链式写法,也可以用rv::copy适配器直接串在管道里:
vector<YourElementType> dest; dest.reserve(100'000); GetForwardIteratorRange() | rv::transform([](auto item) { /* 你的转换逻辑 */ }) | rv::copy(back_inserter(dest));
关于r::to(dest)的说明
range-v3的r::to设计初衷是从range创建新容器,而非向已存在的容器追加元素,所以确实没有支持传入已初始化容器并填充的重载,你之前的写法自然无效。
总结
你没有遗漏range-v3的核心特性——上面的ranges::copy/rv::copy就是最贴合需求的惯用法,完全不需要依赖boost.range的实现。
内容的提问来源于stack exchange,提问作者Felix Dombek
相关产品推荐
相关产品推荐

