如何将字符串推入shared_ptr的向量中?

时间:2019-10-17 18:38:59

标签: c++ vector iterator shared-ptr

如果我有一个共享指针向量(V1)和一个包含很多字符串的向量(V2)。如何使用V1内部的shared_ptr指向V2内部的元素?

EX:

std::vector< std::shared_ptr< SImplementation > > V1;  
std::vector < std::string > V2; // there are strings in the V2 already

for(auto i : V2){
    V1.push_back(i) // I tried this way, but it does not work because of the different types
}

我可以使用迭代器或使用另一个shared_pointer指向V2中的字符串吗?

2 个答案:

答案 0 :(得分:1)

std::shared_ptr是管理内存所有权的工具。这里的问题是std::vector已经在管理其内存。另外,std::vector在调整或删除元素的大小时会使对其元素的引用和指针无效。

您可能想要的是拥有两个共享资源的向量。该资源将在两个向量之间共享:

// there are strings in the V2 already
std::vector<std::shared_ptr<std::string>> V1;  
std::vector<std::shared_ptr<std::string>> V2;

for (auto ptr : V2) {
    V1.push_back(ptr) // now works, ptr is a std::shared_ptr<std::string>
}

如果无法更改V2的类型怎么办?然后,您必须以不同的方式引用对象,例如向量的索引,并在擦除元素时使它们保持同步。

答案 1 :(得分:0)

std::shared_ptr没有成员函数push_back。它最多可以指向一个对象(或C ++ 17起的数组)。

  

如何将字符串放入shared_ptr的向量中?

赞:

std::string some_string;
std::vector<std::shared_ptr<std::string>> ptrs;
ptrs.push_back(std::make_shared<std::string>(some_string));