向量---vector

对于许多C程序员而言,(名字,号码)对的内部数组会被看做是一个合适的起点:

    struct Entry
    {
        string name;
        int number;
    };

    Entry phone_book[1000];
    void print_entry(int i)
    {
        cout << phone_book[i].name << ' ' << phone_book[i].number << '\n';
    }

但无论如何,内部数组具有固定的规模。如果我们选择了某个很大的规模,那么就会浪费存储;而如果选择一个过小的规模,数组又会溢出。这两种情况都会使我们不得不去写低级的存储管理代码。标准库提供的 vector 能关照好所有这些情况

    vector<Entry> phone_book(1000);

    void print_entry(int i)    // 简单使用,就像数组一样
    {
        cout << phone_book[i].name << ' ' << phone_book[i].number << '\n';
    }

    void add_entries(int n)    // 将其规模增加n
    {
        phone_book.resize(phone_book.size() + n);
    }

vector() 的成员函数 size() 给出的是它的元素个数。

请注意在 phone_book 的定义中括号的使用。我们是做出了一个元素类型为 vector<Entry> 类型的对象,并通过一个初始值提出对它的规模要求。这与声明内部数组的方式很不一样:

    vector<Entry> book(1000)      // 1000个元素的向量
    vector<Entry> books[1000];    // 1000个空向量的数组

如果你真的犯了一个错误,在声明一个 vector 时将 [] 用到了你本来应该用 () 的地方,在你试图去使用这个 vector 时,几乎可以肯定你的编译器能够捕捉到这个错误,并发出一个错误信息。

  vector 是一种能赋值的简单对象。例如,

    void f(vector<Entry>& v)
    {
        vector<Entry> v2 = phone_book;
        v = v2;
        // ...
    }

vector 赋值涉及到复制其中的所有元素。这样,在 f() 初始化和赋值之后,在 vv2 里各保有 phone_book 中的各个 Entry 的一份副本。当向量里存有许多元素时,这种看起来无害的赋值和初始化的代价也可能很高。

🔚