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

Chr*_*bek 6 c++ stl

是否有任何转换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));
}
Run Code Online (Sandbox Code Playgroud)

用一条线.

提供一些上下文:我有一组函数可以对a进行计算std::vector<Polygon>,有些则需要std::vector<Polygon*>.所以我需要来回转换几次,因为这些函数的接口不应该改变.

San*_*ker 10

虽然你所描述的听起来很奇怪(没有上下文),但使用std::transform你可以在一行代码中进行实际的复制/转换:

transform(source.begin(), source.end(), target.begin(), getPointer);
Run Code Online (Sandbox Code Playgroud)

因为它target有足够的空间容纳所有数据(可以用std::vector::resize例如.),并给出这个一元运算符:

template<typename T> T* getPointer(T& t) { return &t; }
Run Code Online (Sandbox Code Playgroud)

  • 如果`target`是空的,那么使用`back_inserter(target)`代替`target.begin()`避免需要`resize`.但是,为了避免向量重新分配自己超过必要的数量,"保留"仍然是值得的. (2认同)

Bjo*_*orn 6

如果你有c ++ 0x,下面的代码可以解决这个问题(lambda需要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;
}
Run Code Online (Sandbox Code Playgroud)

一方面注意:确保在最后一次使用目标矢量之前不清除源矢量,因为它是实际对象的所有者.目标向量仅包含指针.