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

6
我有这个向量:

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 不是模板参数,而是指定的类型。

2
有复制,但我认为这是必要的。否则你怎么能获得一个 vector<T> 呢? - alcedine
你为什么一开始就要使用原始指针向量? - LogicStuff
@Zulan:特定类型 - Humam Helfawi
@alcedine 这正是我所要求的。 - Humam Helfawi
1
我认为我知道@LogicStuff的目标是什么,如果向量包含指向基类的指针,则在切片方面会遇到大问题,您的基类可能违反所谓的“三定律”。 - Ulrich Eckhardt
显示剩余6条评论
3个回答

6

如果你需要创建一些副本,你可以避免构造默认值并通过直接复制构造来创建副本:

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;});

是的,那肯定更好。不过,我在考虑完全更好的解决方案,但似乎不存在。再次感谢。 - Humam Helfawi
[](T* item){return *T;} 应该改为 [](T* item){return *item;},对吗? - user3405291
@user3405291:好的,错别字已经修正。 - Jarod42

3

你的方法尽可能正确。但是你需要大量复制。另一个问题是,如果你有任何从T派生的类,它也会“切片”。有时你有两个不同的程序,这是不可避免的,但更有可能的是,你应该重新评估调用者或函数的设计。


关于切片的通知很好!但是,如果T是一个多态基类,那么foo的签名就没有任何意义了。 - Zulan
foo适合作为基类。正是对bar的函数调用阻止了多态性的实现。 - Rob L

2

由于T是一个特定的给定类型,没有办法避免复制,除非修改Tbar

如果您可以将T设置为泛型,那么您可以创建一种“PIMPL-wrapper”:一个内部包含指向真实T的指针的对象,并通过在内部调用相应的函数来实现T的相同接口。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接