2017-07-04 69 views
-2

主要功能有一行這條線是如何在這個C++代碼片段中工作的?

vector<bookStatusEnum> booksStatus(numbooks, available); 

你能解釋一下這行被執行?我看到代碼段中沒有booksStatus函數。所以它究竟是什麼。

#include <string> 
#include <iostream> 
#include <vector> 
#include <map> 
#include <algorithm> 

using namespace std; 

struct book 
{ 
    string title, author; 

    inline bool operator<(const book& other) const 
    { 
     if (author != other.author) 
      return author < other.author; 

     return title < other.title; 
    } 
}; 

void ReadInBooks(vector<book> & allBooks) 
{ 
    string temp; 

    book currentBook; 

    while (cin >> temp, temp != "END") 
    { 
     currentBook.title = ""; 

     bool first = true; 

     while (*(temp.end() - 1) != '"') 
     { 
      if (!first) 
       currentBook.title += ' '; 

      first = false; 
      currentBook.title += temp; 

      cin >> temp; 
     } 

     if (!first) 
      currentBook.title += ' '; 

     currentBook.title += temp; 

     // Ignore 'by' 
     cin >> temp; 
     // ignore the space after the by 
     cin.ignore(); 

     getline(cin, currentBook.author); 
     allBooks.push_back(currentBook); 
    } 
} 

enum bookStatusEnum { available, borrowed, returned }; 

int main() 
{ 
    vector<book> allBooks; 
    ReadInBooks(allBooks); 
    int numBooks = allBooks.size(); 
    std::sort(allBooks.begin(), allBooks.end()); 

    vector<bookStatusEnum> booksStatus(numBooks, available); 

    map<string, int> positionInAllBooks; 
    for (int i = 0; i < numBooks; ++i) 
     positionInAllBooks[allBooks[i].title] = i; 

    vector<bool> borrowed(allBooks.size(), false); 
    vector<bool> returned(allBooks.size(), false); 

    string command; 
    string bookName; 
    while (cin >> command, command != "END") 
    { 
     if (command == "BORROW") 
     { 
      cin.ignore(); 
      getline(cin, bookName); 
      int pos = positionInAllBooks[bookName]; 
      borrowed[pos] = true; 
      returned[pos] = false; 
     } 

     else if (command == "RETURN") 
     { 
      cin.ignore(); 
      getline(cin, bookName); 
      returned[positionInAllBooks[bookName]] = true; 
     } 

     else // SHELVE 
     { 
      int previous = -1; 
      for (int i = 0; i < numBooks; ++i) 
      { 
       if (!borrowed[i]) 
        previous = i; 
       else if (returned[i]) 
       { 
        if (previous == -1) 
         cout << "Put " << allBooks[i].title << " first\n"; 
        else 
         cout << "Put " << allBooks[i].title << " after " << allBooks[previous].title << '\n'; 

        returned[i] = false; 
        borrowed[i] = false; 
        previous = i; 
       } 
      } 

      cout << "END\n"; 
     } 
    } 
} 

P.S:我沒有找到合適的標題。請隨時提出建議。

+2

是不是隻是向量的構造函數參數? – apokryfos

+0

它可以像'vector booksStatus {numbooks,available};' – user5821508

+1

那樣重新編寫,該行只是說創建一個大小爲'numbooks'並初始化爲'available'的枚舉向量。矢量的名稱將爲'booksStatus' – fersarr

回答

1

bookStatusvector,陣列,它包含bookStatusEnum類型的元素。

作爲C++文檔中所述,該構造函數應該是:

矢量(SIZE_TYPE計數,常量Ť&值,常量分配器&的alloc =分配器());

  • 構造帶計數與數值元件拷貝容器。

所以,numbooks被定義爲的整數且被叫構造函數的第一參數,因此即計數,向量的大小;和availablebookStatusEnum的枚舉器部分,(在技術上C++中,枚舉值默認情況下是一些整數類型)。

因此,該矢量包含numbooksavailable的副本。

vector<bookStatusEnum> booksStatus(numbooks, available); 
0

簡短的解釋:它構建了一個名爲std::vector<bookStatusEnum>booksStatus元素numbooks,每次初始化爲available。 (假設numbooks處於std:vector<bookStatusEnum>::size_type可以表示的值的範圍內)。如果不能這樣做,程序將中止。

長解釋如下.....

由於

  • 存在前方using namespace std(並且沒有其他using指令)
  • 有前述變量範圍 - numbooks這是int類型和available它的類型的bookStatusEnum

效果

是一個名爲booksStatus變量,它是被使用構造,可以接受兩個參數,積分型的一個和另一個bookStatusEnum類型的初始化std::vector<bookStatusEnum>類型的定義。

閱讀文檔std::vector,我們發現它與聲明類似構造一個模板類;

vector(size_type count, const T& value, const Allocator& alloc = Allocator()); 

其中

  • size_type(這實際上是命名std::vector<bookStatusEnum>::size_type)是一種實現定義unsigned積分類型;
  • T是模板參數(即,類型bookStatusEnum如果我們的載體是std::vector<bookStatusEnum>)和;
  • 第三個參數被賦予一個默認值,所以這個構造函數可以 接受兩個參數。

要使用模運算(即0size_type可以表示的最大值之間的轉換後的值)調用此構造中,可變numbooksint轉換爲size_type,並availableconst引用傳遞。

分配器(默認情況下提供)是矢量將用於分配內存的對象。

聲明的淨效果是bookStatus的類型爲std::vector<bookStatusEnum>。該向量中元素的數量爲numbooks(使用模運算轉換爲size_type),每個元素的值爲available

如果構造失敗(例如分配器未能分配內存來保存元素),將拋出異常。由於沒有try/catch塊,因此會導致程序終止(通過調用abort())。

如果建設成功,將存在的對象,直到它的包含範圍結束。在這種情況下,當main()返回時,所以在程序結束時調用向量的析構函數。該析構函數的作用是釋放該向量使用的所有內存(即,該元素集合不再存在)。

簡單!