从向量到指针向量的最短转换
Shortest conversion from vector to vector of pointer
是否有从std::vector<T>
到std::vector<T*>
或std::vector<T&>
的快捷方式?
实际上我想替换:
std::vector<T> source;
std::vector<T*> target;
for(auto it = source.begin(); it != source.end(); it++)
{
target.push_back(&(*it));
}
单行
提供一些上下文:我有一组函数在std::vector<Polygon>
和一些需要std::vector<Polygon*>
上进行计算。所以我需要来回转换几次,因为这些函数的接口不应该改变。
虽然您所描述的听起来很奇怪(没有上下文),但使用std::transform
,您可以在一行代码中完成实际的复制/转换:
transform(source.begin(), source.end(), target.begin(), getPointer);
假设target
有足够的空间容纳所有数据(可以用std::vector::resize
实现,例如),并且给定这个一元运算符:
template<typename T> T* getPointer(T& t) { return &t; }
如果你有c++0x,下面的代码可以解决这个问题(lambdas需要c++0x):
template <typename T>
std::vector<T*> convertFrom(std::vector<T>& source)
{
std::vector<T*> target(source.size());
std::transform(source.begin(), source.end(), target.begin(), [](T& t) { return &t; });
return target;
}
旁注:确保源向量在最后一次使用目标向量之前没有被清理,因为它是实际对象的所有者。目标向量只包含指针。
另一个想法是使用boost迭代器。
既然它完全不同,我想我应该把它作为一个新的回应:
首先使用boost::transform_iterator
:
template<typename T> T* getPointer(T& t) { return &t; }
boost::transform_iterator<T* (*)(T&), std::vector<T>::iterator> begin(source.begin(), getPointer), end(source.end(), getPointer);
std::vector<T*> target(begin, end);
或者从target
向量构造source
向量(如果这个方向也适用于您),您可以使用boost::indirect_iterator
:
boost::indirect_iterator<std::vector<T*>::iterator> begin(target.begin()), end(target.end());
std::vector<T> source(begin, end);
它可能不漂亮,但很有效。
相关文章:
- 将CHW格式的浮点向量转换为cv::Mat
- 将元组的向量转换/构造为堆
- 将编译时常量向量转换为堆分配版本
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 在<uint8_t> <char> c++ 中将常量向量转换为常量向量
- C++ 将地址保存为字符串的向量转换为新的向量
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 在 c++ 中将集合转换为向量和向量转换为字符串时出现运行时异常
- 如何使用istream_iterator将无符号字符向量转换为字符串?
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- 将字符向量转换为单个字符串
- <int> 使用 fmt 库将向量转换为字符串
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 在C++中将字符向量转换为字符串向量
- 避免从单一元素向量转换为基元类型
- 无法从向量<T>转换为 T
- 将浮点数向量转换为十六进制/二进制字符串
- 虚拟地将结构向量转换为结构成员的向量
- 将整数向量转换为字节数组向量,然后调用每个字节数组
- 如何从向量转换为<char>数字整数