检查现有记录

时间:2010-11-05 18:22:57

标签: c++

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不会被分配给副本。

2 个答案:

答案 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和的值每次迭代都要过境。