假设Foo
是任意类。
Foo f[5];
std::vector<Foo*> v;
我可以使用for循环语句将元素插入指针的矢量中:
for (size_t i = 0; i < 5; i++)
v.push_back(&f[i]);
是否可以使用std::vector::insert()
函数插入它们?为什么不能?我已经试过好几次了,但都失败了:
v.insert(v.end(), &f[0], &f[5]); // error
如果你的意思是,对insert
进行一次调用,那么no-可以复制一个范围,在需要时执行类型转换,但不能应用任意转换,比如获取每个元素的地址。
您可以使用std::transform
:
std::transform(std::begin(f), std::end(f),
std::back_inserter(v),
[](Foo & f) {return &f;});
尽管这可能不如简单的循环清晰,尤其是如果您使用新型语法
for (Foo & foo : f) {
v.push_back(&foo);
}
是的,您也可以使用insert。但这两种操作之间几乎没有什么区别:-
pushback将一个新元素放在矢量的末尾,insert允许您选择位置。这会影响性能。insert强制将所有图元移动到新图元的选定位置之后。你只需要为它留出一个位置。这就是为什么插入的效率通常不如push_back。