为什么这种情况发生在向量中
Why does this happen in with vectors
我一直在编写代码来将书籍添加到图书馆。当我将书籍添加到图书馆并尝试显示它时,图书馆中没有存储(显示(任何内容
在这里,我将图书馆可以容纳的最大书籍数量设置为 100。
整数最大书籍=100; 矢量迷你图书馆(最大书籍(; 但是,当我擦除"(最大书籍("时,代码工作正常。但我没有 明白为什么吗?
#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;
}
int maxbooks=100;
vector <book> minilibrary(maxbooks);
这些行创建了包含 100 本书的 Vector,每本书都是由默认构造函数创建的。
现在,当您将新书添加到矢量中时,它的大小为 101,但displayLibrary
取 1 作为要打印的书籍数量,并且您打印minilibrary[0]
- 默认书籍,而不是您添加的书籍,即 minilibrary[100]
.
您应该创建minilibrary
作为空向量。然后,您可以将书籍推入其中。
因为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 本"空"(未初始化(书籍和您输入的最后一本书。
向量类似于数组,但不同之处在于它们可以动态调整大小。这就是为什么与数组不同,您可以在不指定其最大限制的情况下初始化向量(在您的情况下 - maxbooks(
有关如何以各种方式初始化向量的文档,请参阅文档。
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何在不C++排序的情况下找到给定向量中的第一、第二和第三高值?
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 重新分配向量时,向量中的内存会发生什么情况
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 在无法访问向量的情况下查找迭代器的末尾
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 我怎样才能在不重复的情况下随机迭代向量的每个元素
- 调整向量大小并检索值,这是否正确或在任何情况下都可能导致段错误?
- 如何在不迭代的情况下从string_view向量创建字符串向量?
- 如何在不以不同方式创建每个向量的情况下制作 2-D 向量列表?
- 如何在不使用标准算法的情况下在排序向量中添加 c 元素?
- 是否可以在不指定类型的情况下从 istringstream 转到向量?
- 在不使用递归的情况下求解所有 2D 字符串向量组合?(C++)
- 如何在不复制的情况下将向量向量从类函数传递到功能
- 为什么这种情况发生在向量中
- 如何在<typename> <long> 不更改给定代码的情况下将自定义向量与 STL 向量相互转换?
- 我可以在不循环访问数组/向量的情况下检查数组/向量中的单词吗?
- 如何在使用和无发现的情况下使用和不使用的字符串向量搜索元素