STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式.
在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。
一:
vector:
从后面快速的插入与删除,直接访问任何元素。
可以看作动态数组。自动分配一块连续的内存空间进行数据存储。
当存储的数据超过分配的空间时,会重新分配一块内存块:
首先,会申请一块更大的内存块;然后,将原来的数据拷贝到新的内存块中;
其次,销毁掉原内存块中的对象(调用对象的析构函数);最后,将原来的
内存空间释放掉。
随机访问方便,支持[]/vector.at()。
vector被设计成只能在后端进行追加和删除操作。
只能在最后进行push和pop,不能在头进行。
vector 类中定义了4中种构造函数:
默认构造函数:构造一个初始长度为0的空向量.
vector<int>v1;
构造函数:有一个可选参数,如果预定义了size,他的成员都被赋为0.
vector<int>v2(init_size,0);
复制构造函数:构造一个新的向量,作为已存在的向量的完全复制.
vector<int>v3(v2);
带两个常量参数的构造函数:
vector<int>v4(first,last);
方法:
c.assign(beg,end) c.assign(n,elem) 将(beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。
c. at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 c.back() 传回最后一个数据,不检查这个数据是否存在。
c.begin() 传回迭代器中的第一个数据地址。
c.capacity() 返回容器中数据个数。
c.clear() 移除容器中所有数据。
c.empty() 判断容器是否为空。
c.end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。 c.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。 c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。 c.front() 传回第一个数据。
get_allocator 使用构造函数返回一个拷贝。
c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置 c.insert(pos,n,elem) // 在pos位置插入n个elem数据,无返回值 c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值c.max_size() 返回容器中最大数据的数量。
c.pop_back() 删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.rbegin() 传回一个逆向队列的第一个数据。
c.rend() 传回一个逆向队列的最后一个数据的下一个位置。 c.resize(num) 重新指定队列的长度。
c.reserve() 保留适当的容量。
c.size() 返回容器中实际数据的个数。
c1.swap(c2) // 将c1和c2元素互换
example:
#include<iostream>
#include<vector>
using namespace std;
typedef vector<int> INTVECTOR;
void main(void)
{
INTVECTOR vec 1;
INTVECTOR vec2(10,6);
INTVECTOR vec3(vec2.begin(),vec2.begin()+3);
INTVECTOR::iterator i;
cout<<"vec1.begin()--vec1.end():"<<endl;
for(i=vec1.begin();i!=vec1.end();++i)
cout<<*i<<"";
cout<<endl;