1. STL容器的分类:
2. STL容器的要求:
3. 容器的迭代器:
STL容器的分类:
一般来讲STL容器可以分为两大类,一类为序列式容器,另一类为关联式容器。
序列式容器为:vector,deque,list(可序),序列式容器每个元素都有自己固定的位置,这个位置只与插入的时间和位置,与元素的大小无关。
关联式容器:
map,multimap,set,multiset(已序)每个元素都有其一定规则排列的位置,其位置与元素值有关。
关联与序列式容器的优劣式,关联式相对于序列式容器查找更为高效,序列相对于关联式插入与删除更为高效。
STL容器的要求:(STL容器必须具备的三个条件)
1.容器在进行添加操作时,内部实现的拷贝操作。
2.所有元素形成次序(所有的元素的物理位置都是有次序的)
3.但是一般而言容器的所有的操作并非绝对安全。
容器的迭代器:
1.迭代器可遍历容器的全部或部分成元素的对象,对象的行为类似于智能指针,这个对象会有指针可以进行运算操作。
2.每一个容器都自带一个迭代器。
3.如果有两个迭代器会组成一个班开半闭合的空间。
优点:为遍历元素提供结束循环的时机,不需要对空区间采取特殊的处理方法。
示例模板栈:
template<class T>
class Stack
{
private:
T *pBuff;
size_t len;
size_t maxSize;
public:
Stack();
~Stack();
void clear();
void push_back(const T&elem);
void pop();
void Print();
};
template<class T>
Stack<T>::Stack()
{
len = maxSize = 0;
pBuff = nullptr;
}
template<class T>
Stack<T>::~Stack()
{
clear();
}
template<class T>
void Stack<T>::clear()
{
if (pBuff)
{
delete[] pBuff;
len = maxSize = 0;
pBuff = nullptr;
}
}
template<class T>
void Stack<T>::push_back(const T&elem)
{
if (len < maxSize)
{
pBuff[len++] = elem;
}
else
{
maxSize += (maxSize / 2>1 ? maxSize : 1);
T*temp = new T[maxSize];
for (int i = 0; i < len; i++)
{
temp[i] = pBuff[i];
}
delete[]pBuff;
pBuff = temp;
pBuff[len++] = elem;
temp = nullptr;
}
}
template<class T>
void Stack<T>::pop()
{
if (len > 0)
{
pBuff[len--];
}
}
template<class T>
void Stack<T>::Print()
{
for (int i = 0; i < len; i++)
{
cout << pBuff[i] << "\t";
}
cout << endl;
}
vector模拟的动态数组
1.在数组的尾部可以进行快速的添加和删除,在中部和前部效率比较低。
2.数组只需要一个首地址和下标,就可以访问到所有的元素。
3.动态一词又包含着数组的长度是不固定的,是可以改变的。
4.指针表示堆区 的一个数组,然后重新分配后又指向另一个数组。
在C++标准中并没有以动态数组的方式来实现vector只是规定了相应的条件和操作的复杂度。
deque是双向开口可进可出的容器(其底层是多个vector组成)
1.deque容器也创造了连续内存的假象,用以实现内存的可扩充。
2.deque使用的模拟内存连续,其实现这一功能是借助于迭代器制造出来的假象。
list是双向链表(是不连续的的空间)
1.list由于其采用的不是连续的空间,所以即使在中间部分插入和删除也比较快速。
2.List有一个重要的性质就是插入和接合操作都不会造成原有的List迭代器失效
set 集合(它底层使用平衡的搜索树——红黑树实现)
1.其插入和删除具有高效性(因为其内部插入和删除仅需要操作使用指针操作结点即可完成,不需要内存的移动和删除)
2.set中的每一个元素值都是唯一的,且其可以自动的进行排序。
multiset多重集合
1.multiset和set具有一样的成员函数,但是由于其可以存放重复的元素,所以它们的具体实现会有一些不同。
map 其英文意思为映射(顾名思义其为按图索骥)
1.map具有键值和其对应的内容,按照键值来寻找相应的内容。
2.map<K,T> 类模板定义在 map 文件头中,它定义了一个保存 T 类型对象的 map,每个 T 类型的对象都有一个关联的 K 类型的键。
3.map对元素的组织方式并没有一个具体的要求,但其一般会保存在在一个平衡二叉树上。
multimap多重映射
1.multimap保存的是有序的键值对,但其内部的元素可以重复。
2.multimap和map具有相同范围的构造函数。