转换为常量向量
Transform into a const vector
我手头有一些Foo
的向量,我想把它转换成一个Bar
s的向量,一个const
的向量。我能想到的最好的方法是:
Bar foo2bar(const Foo& foo);
std::vector<Foo> foos = {...};
const std::vector<Bar> bars = [&foos] {
std::vector<Bar> bars;
bars.reserve(foos.size());
std::transform(foos.cbegin(), foos.cend(),
std::back_inserter(bars),
foo2bar);
return bars;
}();
而且我认为大多数编译器应该省略 lambda 的返回值,所以这应该接近理想。唯一的缺点可能是需要创建一个 lambda,但我认为这不是太大的问题。
这种方法是否存在任何阴险的问题,是否有更好的方法(例如,更快,更清洁)?C++11可用。
最简单的解决方案是完全放弃const
要求。您仍然可以向其他范围公开对const
的引用。
如果做不到这一点,这应该没问题。lambda 主体可能会被内联,lambda 的"创建"是一个编译时过程,返回值将被移动或完全省略。实际上,您的方法非常优雅。
如果你真的不能忍受lambda的想法,那么你可以达到boost的transform_iterator
:
#include <vector>
#include <boost/iterator/transform_iterator.hpp>
struct Foo {};
struct Bar {};
Bar foo2bar(const Foo& f) {
return Bar {};
}
int main()
{
std::vector<Foo> foos = { };
using boost::make_transform_iterator;
const std::vector<Bar> bars (make_transform_iterator(foos.begin(), &foo2bar),
make_transform_iterator(foos.end(), &foo2bar));
}
但是,lambda 在优化后没有性能损失,可以说不那么神秘,所以我鼓励这样做。
或者,
您可以将foo2bar()
函数作为转换运算符移动到Foo
类中:
struct Bar {};
struct Foo
{
// conversion opertor
operator Bar() const
{
// code to create Bar bar
return bar;
}
};
int main()
{
std::vector<Foo> foos = {};
const std::vector<Bar> bars(foos.begin(), foos.end());
}
相关文章:
- 为什么C++常量模板化向量在使用之前没有初始化?
- 如何返回向量的常量引用?
- 初始化指针的常量向量
- 将编译时常量向量转换为堆分配版本
- 在<uint8_t> <char> c++ 中将常量向量转换为常量向量
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++ 获取向量中常量字符* [ ] 的长度
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- 当类具有常量时,将对象插入到向量中
- C++模板,用于通过常量引用和原始指针传递向量
- 对向量<常量字符 *> 进行排序
- 非常量对象的向量似乎在基于范围的 for 循环中被视为常量
- 对常量向量进行常量unique_ptr
- C++向量迭代:常量 vs. 常量自动 vs. 无常量
- 传递具有常量内容的向量
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 常量向量中的非常量
- 静态常量 std::<char>没有堆的向量初始化?
- 如果方法是常量,如何找到向量的中位数?
- 如何将智能指针向量转换为常量向量,该常量向量包含指向常量的智能指针