STL从广义上讲分为三类:算法(algotithm)、容器(container)、迭代器(iterator),容器和算法通过迭代器可以进行无缝连接。
容器
//把你的元素copy到容器中,实现了数据类型和算法的有效分离
序列式容器(Sequence containers)
每个元素都有固定位置,取决于插入时机和地点,和元素值无关。vector、deque、list
关联式容器(Associated containers)
元素位置取决于特定的排序准则,和插入顺序无关 set、multiset、map、multimap
数据结构 | 描述 | 实现头文件 |
向量(vector) | 连续存储的元素 | <vector> |
列表(list) | 由节点组成的双向链表,每个结点包含着一个元素 | <list> |
双队列(deque) | 连续存储的指向不同元素的指针所组成的数组 | <deque> |
集合(set) | 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 | <set> |
多重集合(multiset) | 允许存在两个次序相等的元素的集合 | <set> |
栈(stack) | 后进先出的值的排列 | <stack> |
队列(queue) | 先进先出的执的排列 | <queue> |
优先队列(priority_queue) | 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 | <queue> |
映射(map) | 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 | <map> |
多重映射(multimap) | 允许键对有相等的次序的映射 | <map> |
迭代器
//相当于一个指针 分类
软件设计有一个基本原则,所有的问题都可以通过引进一个中间层来简化,而在STL中迭代器就起到了这样的作用。几乎STL提
供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。
算法
//算法和迭代器进行无缝连接
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。
#pragma warning(disable : 4996)
#include <iostream>
#include "vector"
#include "algorithm"
using namespace std;
class Person
{
public:
Person(const int age, const char *name)
{
this->m_age = age;
strcpy(m_name, name);
}
void PrintT()
{
cout << m_age << " " << m_name << endl;
}
public:
int m_age;
char m_name[68];
};
int main()
{
{
//容器
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
//迭代器:指针
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << endl;
}
算法
//int num = count(v1.begin(), v1.end(), 3);
//cout << num << endl;
}
{
Person t1(22, "zhangsan"), t2(23, "lisi"), t3(24, "wangwu");
vector<Person> vT1;
vT1.push_back(t1);
vT1.push_back(t2);
vT1.push_back(t3);
for (vector<Person>::iterator it = vT1.begin();it != vT1.end();it++)
{
cout << it->m_age <<" "<< it->m_name <<endl;
}
}
{
Person t1(32, "jhaj"), t2(33, "lily"), t3(34, "mati");
Person *pT1, *pT2, *pT3;
pT1 = &t1;
pT2 = &t2;
pT3 = &t3;
vector<Person *> vT2;
vT2.push_back(pT1);
vT2.push_back(pT2);
vT2.push_back(pT3);
for (vector<Person *>::iterator it = vT2.begin(); it != vT2.end(); it++)
{
cout << (*it)->m_age << " " << (*it)->m_name << endl;
}
}
system("pause");
return 0;
}