class Catalog {
bool BookCopy;
public:
string BookTitle;
Catalog()
{
BookCopy = false;
}
Catalog(string Title, bool Copy)
{
BookTitle = Title;
BookCopy = Copy;
}
void SetTitle(string Title) {BookTitle = Title; }
void SetBookCopy(bool Copy) {BookCopy = Copy; }
string GetTitle() { return BookTitle; }
bool GetCopy() { return BookCopy; }
};
class BookList {
vector<Catalog> List;
vector<Catalog>::iterator Transit;
public:
void Fill();
void Show();
};
void BookList::Fill() //Create book record
{
string Title;
bool Copy;
Catalog Buffer;
cout << "Enter book information, Stop To quit" << endl;
cout << "-------------------------- " << endl;
while(true)
{
cout << "Title: ";
getline(cin, Title);
if(Title == "Stop")
break;
for(Transit = List.begin() ; Transit != List.end() ; Transit++ ) {
if(Transit->GetTitle() == Title) {
Copy = true;
}
else
Copy = false;
}
我想在制作新唱片时检查是否存在相同的标题。如果它存在则将1分配给Copy,否则将其保留为0.当我创建具有相同标题的记录时,1不会被分配给副本。
答案 0 :(得分:1)
除非这是作业,否则你应该几乎完全重写它。
首先,您应该将“Book”定义为类,并为其定义提取运算符:
class Book {
string title;
string additional;
public:
friend std::istream &operator>>(std::istream &is, Book &b) {
std::getline(is, b);
return is;
}
// see reason for this below
bool operator<(Book const &other) const {
return title < other.title;
}
};
然而,我注意到,“复制”似乎并不是本书的特征。在大多数情况下,你真正拥有的是一系列书籍,以及任何特定标题的一些副本(可能是一个)。为此,我会做类似的事情:
std::map<Book, int> BookList;
要使用map
,您的“密钥”(在这种情况下为Book
)必须具有可比性 - 即operator<
必须返回有意义的结果他们(这就是我在上面定义的原因)。
现在,我们在Book类中只有一个给定标题的副本,而不是Book类中的“copy”成员:
std::cout << "Please enter book title:";
Book b;
std::cin >> b; // User enters book data
// Increment the number of copies of this title.
// Basically works out to:
// If the title wasn't in the list,
// inserts it with a value of 0, then increments it to 1.
// else
// increment # of copies of title already in list
//
++BookList[b];
请注意,这也比您正在进行的操作更有效 - 它对每个现有书执行(对数)树搜索,而不是线性搜索。
答案 1 :(得分:1)
要解决原始程序中的问题:当找到重复的标题时,应终止for(Transit)循环,而不是继续比较其他录制的标题。因此,除非重复的标题是列表中的最后一个,否则副本将始终为false。
这是我不愿意给出答案的问题之一,因为我认为OP会从如何找到问题的建议中学到更多 - 即使用调试器(或cout)来打印Copy和的值每次迭代都要过境。