从向量到指针向量的最短转换

Shortest conversion from vector to vector of pointer

本文关键字:向量 转换 指针      更新时间:2023-10-16

是否有从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);

它可能不漂亮,但很有效。