2017-07-04 37 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()返回时,所以在程序结束时调用向量的析构函数。该析构函数的作用是释放该向量使用的所有内存(即,该元素集合不再存在)。

简单!