Вы можете создать список строковых указателей.
std::list<std::string*> slist1;
slist1.push_back(new std::string("Hello"));
slist1.push_back(new std::string("Welcome"));
slist1.push_back(new std::string("Hi"));
slist1.push_back(new std::string("World"));
Затем создайте другой список, используя те же самые указатели.
auto it = slist1.begin();
std::list<std::string*> slist2(std::next(it, 1), std::next(it, 3));
Эти slist2
указатели списка - те же самые указатели, что ив slist1
.Теперь изменение любого указателя будет отражено в обоих местах.Например, приведенный ниже код замените «Welcome» и «Hi» в slist2 на «abc».Изменения отражаются и в slist1, так как указатели совпадают.
for (auto &s: slist2) {
std::cout << *s << "\n";
*s = "abc";
}
for (auto &s: slist1) {
std::cout << *s << " "; //prints Hello abc abc World
}
Обратите внимание, что этот код не является безопасным для исключения, и список придется удалить вручную.Для обеспечения безопасности исключений и автоматического уничтожения, пожалуйста, используйте умные указатели.Ниже приведен пример использования shared_ptr.
#include <iostream>
#include <memory>
#include <string>
#include <list>
int main()
{
std::list<std::shared_ptr<std::string>> slist1;
slist1.push_back(std::make_shared<std::string>("Hello"));
slist1.push_back(std::make_shared<std::string>("Welcome"));
slist1.push_back(std::make_shared<std::string>("Hi"));
slist1.push_back(std::make_shared<std::string>("World"));
auto it = slist1.begin();
std::list<std::shared_ptr<std::string>> slist2(std::next(it, 1), std::next(it, 3));
for (auto &s: slist2) {
std::cout << *s << " ";
*s = "abc";
}
for (auto &s: slist1)
std::cout << *s << " "; //prints Hello abc abc World
return 0;
}