我有一个简单的结构和它的对象向量。我想把所有的对象移到shared_ptrs的向量上。我不再需要初始向量了。我向你介绍了我的情况。
我的方法正确吗?我想用最有效的方法:
struct MyStruct
{
int i_;
std::string s_;
};
void copyVector(std::vector< MyStruct>&& vt)
{
std::vector<std::shared_ptr<MyStruct>> ptrsVt;
for (auto& v : vt)
ptrsVt.push_back(std::make_shared<MyStruct>(std::move(v)));
// ...
}
void processing()
{
std::vector<MyStruct> vt = getVectorFromSomewhere();
copyVector(std::move(vt));
}
是的,没错。您可能希望事先reserve
目的地的大小:
#include <algorithm>
#include <cstdio>
#include <iterator>
#include <memory>
#include <string>
#include <utility>
#include <vector>
template <class T>
auto transform_vector(std::vector<T>&& src) -> std::vector<std::shared_ptr<T>> {
std::vector<std::shared_ptr<T>> dst;
dst.reserve(src.size());
transform(begin(src), end(src), back_inserter(dst),
[](T& elm) { return std::make_shared<T>(std::move(elm)); });
return dst;
}
int main() {
std::vector<std::string> elms{"a", "b", "c"};
auto ptrs = transform_vector(std::move(elms));
for (auto const& elm : elms) {
std::printf(""%s", ", elm.c_str()); // moved strings, possibly empty
}
std::putchar('n');
for (auto const& ptr : ptrs) {
std::printf(""%s", ", ptr->c_str()); // "a", "b", "c"
}
std::putchar('n');
}