最有用的标准库容器当属 vector。一个 vector就是一个给定类型元素的序列,元素在内存中是连续存储的:
3.2.2节和3.4节的 Vector示例给出了标准库 vector的实现思想,13.6节和31.4节则会讨论更多细节内容。
我们可以用一组值来初始化 vector,当然,值的类型必须与 vector元素类型吻合:
vector<Entry> phone_book={{"David Hume",123456},{"Karl Poppe",123456},{"breafas sdas",456789}};
我们可以通过下标运算符访问元素:
void print_book(const vector<Entry>& book){for(int i=0;i!=book.size();++i)cout<<book[i]<<'\n';}
照例,下标从0开始,因此book[0]保存的表项是 David hume。 vector的成员函数size()返回元素的数目。
vector的所有元素构成了一个范围,因此我们可以对其使用范围for循环(见2.2.5节):
void print_ book(const vector<Entry>& book)for(const auto&x:book) //关于"auto”,请查阅2.2.2节cout≤<x<<"n’
定义一个 vector时,为它设定一个初始大小(初始的元素数目):
vector<int> v1={1,2,3,4}; //size为4vector<string> v2; //size为0vector<Shape*>v3(23) //size为23;元素初值是 nullptrvector<double> v4(32,9.9) //size为32;元素初值是99
我们可以在一对圆括号中显式地给出 vector的大小,如(23)。默认情况下,元素被初始化为其类型的默认值(例如,指针初始化为nullptr,整数初始化为0)。如果不想要默认值你可以通过构造函数的第2个实参来指定一个值(例如,将V4的32个元素初始化为9.9)。
vector的初始大小随着程序的执行可以被改变。 vector最常用的一个操作就是push_back(),它向 vector末尾追加一个新元素,从而将 vector的规模增大1.例如:
void input(){for(Entry e;cin>>e;)phone_book.push_back(e);}
这段程序从标准输入读取 Entry,保存到 phone_book中,直至遇到输入结束标识(如文件尾)或是输入操作遇到一个格式错误。标准库 vector经过了精心设计,即使不断调用push back()来扩充 vector也会很高效
在赋值和初始化时, vector可以被拷贝。例如:
vector<Entry> book2 = phone_book
如3.3节所述,拷贝和移动 vector是通过构造函数和赋值运算符实现的。 vector的赋值过程包括拷贝其中的元素。因此,在book2初始化完成后,它和 phone_bok各自保存每个 Entry的一份副本。当一个 vector包含很多元素时,这样一个看起来无害的赋值或初始化操作可能非常耗时。因此,当拷贝并非必要时,我们应该优先使用引用或指针(见7.2节和7.7节)或是移动操作(见3.3.2节和17.5.2节).
