Как сохранить данные вектора после выхода из функции?

    struct Book{
string title;
string author;
int year;
};
struct Library{
vector <Book> sp;
};
void search(Library l, string b){
for(int i=0;i<l.sp.size();i++){
    if(l.sp[i].title==b){
        cout<<"Назва книги"<<l.sp[i].title<<"\nЇї автор: "<<l.sp[i].author<<"\nЇї рік написання: "<<l.sp[i].year<<endl;
    }
}
}
void writel(Library l, const Book &b){
l.sp.push_back(b);
}
void printl(Library l){
for(int i;i<l.sp.size();i++){
cout<<"Назва книги"<<l.sp[i].title<<"\nЇї автор: "<<l.sp[i].author<<"\nЇї рік написання: "<<l.sp[i].year<<endl;
}
}
int main(){
setlocale(LC_ALL,"Ukrainian");
Library mylib;
Book mybook;
int action=0;
while(action!=3){
cout<<"Напишіть свою дію у цифрах(0 - Додавання книги у бібліотеку, 1 - пошук книги по назві, 2 - вивід списку книг, 3 - вихід): "<<endl;
cin>>action;
if(action==0){
    cout<<"Напишіть спочатку назву книги, потім через ентер її автора, потім рік написання: "<<endl;
    cin>>mybook.title;
    cin>>mybook.author;
    cin>>mybook.year; 
    writel(mylib,mybook);
}
if (action==1){
    string name;
    cout<<"Напишіть назву книги яку шукаєте: "<<endl;
    cin>>name;
    search(mylib,name);
}
if (action==2){
    printl(mylib);
}
}
system("pause");
return 0;    
}

Мне надо чтобы вектор в функции writel нормально сохранял и потом не удалялся, чтобы можно было вывести всё что в нём находится. Помогите пожалуйста.


Ответы (1 шт):

Автор решения: isnullxbh

У Вас функция writel принимает аргумент l по значению - это значит, что здесь:

writel(mylib,mybook);

будет вызван конструктор копирования, и внутри writel Вы уже будете работать не с mylib, а с его копией. Соответственно, все изменения будут касаться только этой копии, на состоянии объекта mylib это никак не отразится.

Чтобы исправить эту ошибку, достаточно передавать l по ссылке или указателю:

void writel(Library& l, const Book &b)
{
    l.sp.push_back(b);
}
→ Ссылка