将指针向量转换为对象向量

时间:2016-02-16 09:05:33

标签: c++ c++11 vector

我有这个载体:

std::vector<T*> foo;

我有一个带有以下签名的函数(我无法改变它):

void bar(std::vector<T> const&);

如何以最小的更改将foo传递给该函数?

我目前的做法是:

std::vector<T> another_bar(bar.size());
std::transform(std::begin(bar),std::end(bar),std::begin(another_bar),[](T* item){return *T;});

我认为这里发生了许多不必要的复制。

修改

T不是模板化参数。它是指定的类型。

3 个答案:

答案 0 :(得分:4)

虽然您需要某些副本,但您可以避免构造默认值,然后通过直接复制构造创建副本:

std::vector<T> another_bar;
another_bar.reserve(bar.size());
std::transform(std::begin(bar), std::end(bar),
               std::back_inserter(another_bar),[](T* item){return *item;});

答案 1 :(得分:3)

您的方法尽可能正确。你必须做很多复制。另一个问题是,如果你有任何来自T的类,它也会“切片”。有时你有两个不同的程序,这是不可避免的,但更有可能你应该重新评估调用者或函数的设计。

答案 2 :(得分:2)

由于T是特定的给定类型,因此无法在不修改Tbar的情况下避免副本。

如果你可以使T通用,你可以创建一种“PIMPL-wrapper”:一个内部包含指向真实T的指针的对象,并实现{{1}的相同接口通过在内部调用相应的函数。

换句话说,您的转换代码看起来不错。