c++ primer plus 第16章string 类和标准模板库, 16.3.2 可对矢量执行的操作
c++ primer plus 第16章string 类和标准模板库, 16.3.2 可对矢量执行的操作
16.3.2 可对矢量执行的操作
除分配存储空间外,vector 模板还可以完成哪些任务呢?所有的STL容器都提供了一些基本方法,其中包括 size()–返回容器中元素数目、swap()–交换两个容器的内容、begin()–返回一个指向容器中第一个元素的迭代器、end()–返回一个表示超过容器尾的迭代器。什么是迭代器?它是一个广义指针。事实上,它可以是指针,也可以是一个可对其执行类似指针的操作–如解除引用(如 operator*())和递增(如 operator++( ))–的对象。稍后将知道,通过将指针广义化为迭代器,让 STL能够为各种不同的容器类(包括那些简单指针无法处理的类)提供统一的接口。每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为 iterator 的typedef,其作用域为整个类。例如,要为vector的double类型规范声明一个迭代器,可以这样做:
vector<double>::iterator pd;//pd an iterator
假设 scores 是一个 vector对象:
vector<double>scores;
则可以使用迭代器 pd 执行这样的操作:
pd = scores.begin();//have pd point to the first element
*pd =22.3;//dereference pd and assign value to first element
++pd;//make pd point to the next element
正如您看到的,迭代器的行为就像指针。顺便说一句,还有一个C++11自动类型推断很有用的地方。例如,可以不这样做:
vector<double>::iterator pd=scores.begin();
而这样做:
auto pd =scores.begin();//C++11 automatic type deduction回到前面的示例。什么是超过结尾(past-the-end)呢?它是一种迭代器,指向容器最后一个元素后面的那个元素。这与 C-风格字符串最后一个字符后面的空字符类似,只是空字符是一个值,而“超过结尾’是一个指向元素的指针(迭代器)。end()成员函数标识超过结尾的位置。如果将迭代器设置为容器的第一个元素,并不断地递增,则最终它将到达容器结尾,从而遍历整个容器的内容。因此,如果scores和pd的定义与前面的示例中相同,则可以用下面的代码来显示容器的内容:
for(pd=scores.begin();pd != scores.end(); pd++)
cout << *pd << endl;
所有容器都包含刚才讨论的那些方法。vector模板类也包含一些只有某些STL容器才有的方法。push back()是一个方便的方法,它将元素添加到矢量末尾。这样做时,它将负责内存管理,增加矢量的长度,使之能够容纳新的成员。这意味着可以编写这样的代码:
vector<double>scores;//create an empty vector
double temp;
while(cin>>temp &&temp >=0)
scores.push back(temp);
cout <<"You entered"<<scores