2017-07-04 5 views
-2

このC++コードスニペットでこの行がどのように機能していますか? <strong>メイン</strong>機能で

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

bookStatusは、配列bookStatusEnumの要素を含むvectorです。 C++のドキュメントに記載されているように

は、そのコンストラクタがなければならない:

ベクター(size_typeカウント、CONST T &値、CONSTアロケータ& ALLOC =アロケータ())。

  • 構築カウント値持つ要素のコピーを有する容器。

したがって、numbooks整数として定義され、呼び出されるコンストラクタの最初のパラメータである、従ってそれは、カウント、ベクトルの大きさです。 availablebookStatusEnumの値が(技術的にはC++の場合、デフォルトで列挙型の値は整数型です)の列挙型の部分です。

したがって、ベクターは、availableのコピーをnumbooks個含んでいます。

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

短い説明:それはnumbooks要素、availableに初期化それぞれとbooksStatusという名前std::vector<bookStatusEnum>を構築します。 (numbooksstd:vector<bookStatusEnum>::size_typeが表すことができる値の範囲内であると仮定すると)。これに失敗した場合、プログラムは中止されます。

長い説明が続きます.....

  • ので、先行変数がスコープ内にある先行using namespace std(なし他のusingディレクティブ)
  • ある - タイプであるタイプのものでintnumbooksavailablebookStatusEnum

の効果

vector<bookStatusEnum> booksStatus(numbooks, available); 

は二つの引数、整数型の1とタイプbookStatusEnumの他を受け入れることができ、コンストラクタを使用して初期化されるタイプstd::vector<bookStatusEnum>であるbooksStatusという名前の変数の定義です。

std::vectorのドキュメントを読むと、そのテンプレートは、次のように宣言されたコンストラクタを持つテンプレートクラスです。 unsigned整数型を定義

  • size_typeが(実際std::vector<bookStatusEnum>::size_typeと命名される)の実装である

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

  • Tはテンプレートパラメータです(ベクトルがstd::vector<bookStatusEnum>の場合はbookStatusEnum)。
  • 3番目のパラメータにはデフォルト値が与えられているため、このコンストラクタは に2つの引数を受け入れることができます。

このコンストラクタを呼び出すには、可変numbooksはモジュロ演算(0size_typeが表現可能な最大値との間の、すなわち換算値)を用いintからsize_typeに変換され、そしてavailableconst参照によって渡されます。

アロケータ(デフォルトで提供される)は、ベクトルがメモリを割り当てるために使用するオブジェクトです。

bookStatusのタイプはstd::vector<bookStatusEnum>です。そのベクトルの要素数はnumbooks(モジュロ演算を使用してsize_typeに変換されます)であり、各要素の値はavailableです。

構成が失敗した場合(アロケータが要素を保持するためにメモリを割り当てられないなど)、例外がスローされます。 try/catchブロックが存在しないため、プログラムの終了が発生します(abort()を呼び出す)。

構築が成功した場合、オブジェクトはスコープを含むスコープが終了するまで存在します。この場合は、main()が返ってくるので、プログラムの終了時にベクトルのデストラクタが呼び出されます。そのデストラクタの効果は、ベクトルによって使用されるすべてのメモリを解放することです(つまり、要素のセットは存在しなくなります)。

シンプル!

関連する問題