1. STL序列容器中的vector容器
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>
STL提供了很多种容器,每种容器都提供一组操作行为即算法接口。序列容器包括向量(vector)、双端队列(deque)、双向链表(list)。
目录
1.1 vector的基本概念
vector向量是一种随机访问的数组类型,提供了对数组元素的快速、随机访问,以及在序列尾部快速、随机的插入和删除操作,它是大小可变的向量,在需要时可以改变其大小。
创建一个vector对象,可以通过一些方式:
1) std::vector<type> name;
2) std::vector<type> name(size);
3)std::vector<type> name(size,value);
4) std::vector<type> name(first,last);
1.2 vector的特点
a. vector的数据元素在内存中是连续存储的。
b. vector和array数组相似,不同点在于vector可以动态调整内存空间大小。
c. vector 有自己的迭代器,可以用来遍历容器内的元素。
d. 可以随机存取,插入和删除在尾端。插入接口只有push_back,没有push_front。
注意:所谓动态增加大小,并不是在原空间之后续接新空间(因为无法保证原空间之后尚有可配置的空间),而是一块更大的内存空间,然后将原数据拷贝新空间,并释放原空间。因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就都失效了。这是程序员容易犯的一个错误,务必小心。
1.3 vector的迭代器
普通指针都可以作为vector的迭代器,因为vector迭代器所需要的操作行为,如operaroe*, operator->, operator++, operator–, operator+, operator-, operator+=, operator-=, 普通指针天生具备。
vector<int>::iterator intit;
vector<Student>::iterator stdit;
vector<char>::iterator intit;
for (intit = charVector.begin(); intit != charVector.end(); intit++)
{
cout << "iterater:" << *intit << endl;
}
1.4 vector的数据结构
Vector所采用的数据结构非常简单,线性连续空间,它以两个迭代器_Myfirst和_Mylast分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器_Myend指向整块连续内存空间的尾端。
为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求大一些,以备将来可能的扩充,这边是容量的概念。换句话说,一个vector的容量永远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,整个vector容器就得另觅居所。
1.5 vector的常用API
函数 | 说明 |
assign(first,last) | 用迭代器first和last所辖范围内的元素替换向量元素 |
assign(num,val) | 用val的num个副本替换向量元素 |
at(n) | 返回向量中第n个元素的值 |
back() | 返回对向量末尾元素的引用 |
begin() | 返回指向向量中第一个元素的迭代器 |
capcity() | 返回当前向量最多可以容纳的元素个数 |
clear() | 删除向量中所有元素 |
empty() | 如果向量为空,则返回为true值 |
end | 返回指向向量中最后一个元素的迭代器 |
erase(i) | 删除迭代器i所指向的向量元素 |
front() | 返回对向量起始元素的引用 |
insert(i,start,end) | 把迭代器start和end所管辖范围内的元素插入到向量中由迭代器i所指明的位置 |
insert(i,x) | 把值x插入向量中由迭代器i所指明的位置 |
max_size | 返回向量的最大容量 |
pop_back(x) | 删除向量最后一个元素 |
push_back(x) | 把值x放在向量末尾 |
rbegin | 返回一个反向迭代器,指向向量末尾元素之后 |
rend | 返回一个反向迭代器,指向向量起始元素 |
reverse() | 颠倒元素的顺序 |
size() | 返回向量的大小(元素的个数) |
swap(vector) | 交换两个向量的内容 |
resize(n,x) | 重新设置向量大小n,新元素的值初始化为x |