Как вставить строку в вектор shared_ptr? - PullRequest
0 голосов
/ 17 октября 2019

Если у меня есть вектор общих указателей (V1) и вектор, который содержит много строк (V2). Как использовать shared_ptr внутри V1 для указания на элементы внутри 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 ]

1 голос
/ 17 октября 2019

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? Тогда вам придется обращаться к объекту по-другому, например, к индексам вектора и сохранять их синхронизированными при удалении элементов.

0 голосов
/ 17 октября 2019

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...