是否有std函数可以轻松地将指针向量复制到类的向量中,还是必须手动迭代它们?
寻找具有最快/更少代码行的解决方案:)。
一个避免复制而不会泄漏内存的解决方案也受到欢迎!
答案 0 :(得分:6)
我怀疑是否有这样的,下面是一个用于:
的班轮 std::vector<X*> vec1 = { new X, new X };
std::vector<X> vec2;
vec2.reserve(vec1.size());
for (auto p : vec1) vec2.push_back(*p);
如果你想确保没有复制,那么你可以使用std :: reference_wrapper&lt;&gt;:
std::vector<std::reference_wrapper<X>> vec2;
for (auto p : vec1) vec2.push_back(*p);
然后你必须确保在取消分配vec1元素后没有访问vec2的元素。
另一种方法是使用unique_ptr:
std::vector<std::unique_ptr<X>> vec2;
for (auto p : vec1) vec2.emplace_back(p);
现在你可以抛弃vec1,但为什么不制作std::vector<std::unique_ptr<X>>
类型的vec1?
答案 1 :(得分:2)
你必须自己做。 std:transform
或std::for_each
会对您有所帮助:
#include <algorithm>
#include <vector>
#include <functional>
using namespace std::placeholders;
class Myclass{};
Myclass deref(const Myclass *mc) { return *mc;}
void append(std::vector<Myclass> &v, Myclass *mc) {v.push_back(*mc);}
int main(){
std::vector<Myclass*> foo;
std::vector<Myclass> bar;
/* foo is initialised somehow */
/* bar is initialised somehow to hold the same amount of dummy elements */
//solution with transform
std::transform (foo.begin(), foo.end(), bar.begin(), deref);
bar={};
// solution with for_each
auto bound_append = std::bind(append, bar, _1);
std::for_each(foo.begin(), foo.end(), bound_append);
}
汇编机智-std=c++11
(gcc)。
答案 2 :(得分:2)
根本没有手动迭代的单行:
std::for_each(vec1.begin(), vec1.end(), [&](auto x) { vec2.push_back(*x); });
(免责声明:我对参考捕获lambda语法不是100%肯定。)