Почему это происходит с векторами - PullRequest
0 голосов
/ 13 июня 2019

Я пишу код для добавления книг в библиотеку. Когда я добавляю книги в библиотеку и пытаюсь отобразить ее, в библиотеке ничего не хранится (не отображается)

Здесь я устанавливаю максимальное количество книгбиблиотека может содержать до 100.
int maxbooks = 100;векторный минибаланс (maxbooks);когда я стираю "(maxbooks)", однако код работает нормально.Но я не понимаю, почему?

#include <iostream>
#include <vector> 
#include <string>

using namespace std;

//struct model a book 
    struct book {
    string authorname;
    string bookname;
}; //struct ends here 

//function to display number of books in the library
void displayLibrary(vector <book> &cmini_library,int cnum_of_books);

//function to add books to the library;
void add (vector <book> &cminilibrary,book dummylibrary,int &num_of_books);

int main() {
    int option;
    int curr_num_of_books = 0; //current number of books in the library
    int maxbooks = 100; //max number of books our library can hold 
    vector<book> minilibrary(maxbooks); //minilibrary vector of max capacity 100
    book dummylibrary; // a variable used to hold entries for a short period 

    cout << "1.Display all books in the library" << endl;
    cout << "2.Add a book to the library" << endl;
    cout << "option entered: " << endl;
    cin >> option;

    switch (option) {
        case 2:
            add (minilibrary,dummylibrary,curr_num_of_books);
            displayLibrary(minilibrary,curr_num_of_books);
            break;
        }

    return 0;
}

void displayLibrary(vector <book> &cmini_library,int cnum_of_books)
{
    for(int i=0;i<cnum_of_books;i++) {
        cout << "Book name: \t" << cmini_library[i].bookname << endl;
        cout << "Author: \t" << cmini_library[i].authorname << endl;
    }
}

void add(vector<book> &cmini_library,book dummylibrary, int &num_of_books) 
{
    int booksadded=0; // number of books added to the library
    cout << "How many books do you wish to add: ";
    cin >> booksadded;
    cin.ignore(1,'\n');
    for(int i=0;i<booksadded;i++) {
        cout << "Book name: ";
        getline(cin,dummylibrary.bookname); 
        cout << endl;
        cout << "Author: ";
        getline(cin,dummylibrary.authorname);
        cout << endl;
        cmini_library.push_back(dummylibrary);
    }

    num_of_books = num_of_books + booksadded;
}

Ответы [ 3 ]

5 голосов
/ 13 июня 2019
int maxbooks=100;
vector <book> minilibrary(maxbooks);

эти строки создали вектор из 100 книг, каждая книга была создана конструктором по умолчанию.

Теперь, когда вы добавляете новую книгу в вектор, ее размер равен 101, но displayLibrary принимает 1 как количество книг, которые будут напечатаны, и вы печатаете minilibrary[0] - по умолчанию книга, а не книга, которую вы добавили, т.е. minilibrary[100].

Вы должны создать minilibrary как пустой вектор. Затем вы можете вставить туда книги.

2 голосов
/ 13 июня 2019

Потому что vector<book> minilibrary(maxbooks); создает минибаланс с 100 вставленными элементами .Затем вы пытаетесь отобразить их, но вы используете другой счетчик для количества вставленных элементов num_of_books.Например, вы добавляете одну книгу, теперь у вас есть 101 книга, вы печатаете одну книгу (первую), которая пуста.Хотя добавленная книга имеет индекс 100 (после того, как эти 100 были добавлены изначально).

Возможно, вы хотели:

vector<book> minilibrary;
minilibrary.reserve(maxbooks);

РЕДАКТИРОВАТЬ (я добавляю свой собственный комментарий, чтобы увеличить его видимость):Вся проблема началась с несоблюдения основного правила: избегать избыточности любой ценой.С одной стороны, вы сохраняете количество книг как переменную num_of_books, с другой - minilibrary содержит все книги.Если вы пропустите num_of_books значение и используете minilibrary.size(), проблема будет сразу же видна - вы получите 100 «пустых» (неинициализированных) книг и последнюю книгу, которую вы ввели.

1 голос
/ 13 июня 2019

Векторы похожи на массивы, но разница в том, что они могут быть динамически изменены. Вот почему, в отличие от массивов, вы можете инициализировать вектор без указания его максимального значения (в вашем случае - maxbooks)

Пожалуйста, обратитесь к документации о том, как инициализировать вектор различными способами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...