Copy/wrap 向量<Class*> 到向量<Class>
Copy/wrap vector<Class*> to vector<Class>
是否有标准函数可以轻松地将指向 类 的指针向量复制到 类 的向量中,或者我是否必须手动迭代它们?
使用 fastest/fewer 行代码寻找解决方案 :)。
也欢迎避免复制而不泄漏内存的解决方案!
我怀疑是否存在这样的,下面是一个带有 for:
的衬垫
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<>:
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?
你必须自己做。 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) 编译。
完全没有手动迭代的单行代码:
std::for_each(vec1.begin(), vec1.end(), [&](auto x) { vec2.push_back(*x); });
(免责声明:我不是 100% 确定引用捕获 lambda 语法。)
是否有标准函数可以轻松地将指向 类 的指针向量复制到 类 的向量中,或者我是否必须手动迭代它们?
使用 fastest/fewer 行代码寻找解决方案 :)。
也欢迎避免复制而不泄漏内存的解决方案!
我怀疑是否存在这样的,下面是一个带有 for:
的衬垫 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<>:
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?
你必须自己做。 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) 编译。
完全没有手动迭代的单行代码:
std::for_each(vec1.begin(), vec1.end(), [&](auto x) { vec2.push_back(*x); });
(免责声明:我不是 100% 确定引用捕获 lambda 语法。)