是否有任何转换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)
如果你有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)
一方面注意:确保在最后一次使用目标矢量之前不清除源矢量,因为它是实际对象的所有者.目标向量仅包含指针.