3:介绍deque的框架。
STL是 Standard Template Library 的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。
STL提供六大组件,彼此可以配套使用。
1,容器(containers): 各种数据结构,如:vector,list ,deque,set,map等。
2,算法(algorithms): 各种常用的算法,如:sort,swap,search等。
3,迭代器(iterators):扮演容器与算法之间的“粘合剂”,是所谓的“泛型指针”。所有的STL容器都 附带自己专属的迭代器。
4,仿函数(functions):行为类似函数,可作为算法的某种策略。一般的函数指针可视为狭义的仿函数。
5,配接器(adapters): 一种用来修饰容器或仿函数或迭代器接口的东西。
6,配置器(allocators): 负责空间配置和管理。
(1) vector(动态数组)
vector的接口:http://www.cplusplus.com/reference/vector/vector/?kw=vector
void test_vector()
{
vector<int> v; //创建一个vector对象
v.push_back(1); //往vector内插入数据
v.push_back(2);
v.push_back(3);
v.push_back(4);
//普通遍历
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << "";
}
//迭代器遍历vector
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it <<" ";
it++;
}
v.pop_back();//尾删数据
vector<int>::iterator it = find(v.begin(), v.end(), 30);//先找插入位置
v.insert(it, 10);
it = find(v.begin(), v.end(), 30);//找要删除的位置
v.erase(it);
}
(2)string (字符串)
string的接口:http://www.cplusplus.com/reference/string/string/?kw=string
void test_string()
{
string s1("hello");//创建对象
string s2 = "hello";
string::iterator sit = s1.begin();//迭代器遍历
while (sit != s1.end())
{
cout<<*sit<//普通遍历
for (size_t i = 0 ; i < s1.size(); ++i)
{
cout<//使s1变成空串
cout<'1'); //尾插一个字符
s1.append("22222");//尾插一个字符串
s1.pop_back(); //尾删一个字符
cout<5, 1, "%%%");//将5这个位置上的一个字符替换成"%%%"
}
(3) list (带头双向循环链表)
list的接口:http://www.cplusplus.com/reference/list/list/?kw=list
void test_list()
{
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);
l.push_back(5);
//迭代器遍历
list<int>::const_iterator it = l.begin();
while (it != l.end())
{
cout << *it << " ";
++it;
}
cout << endl;
l.reverse();//list的逆置
l.pop_back();//尾删
l.sort();//排序
l.unique();//去重
}
(4)stack(栈)
stack的接口:http://www.cplusplus.com/reference/stack/stack/?kw=stack
void test_stack()
{
stack<int> s;
s.push(1);//入栈
s.push(2);
s.push(3);
s.push(4);
while (!s.empty())
{
cout << s.top() << " ";//取栈顶元素
s.pop();//出栈
}
cout << endl;
}
(5) queue(队列)
queue的接口:http://www.cplusplus.com/reference/queue/queue/?kw=queue
void test_queue()
{
queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
while (!q.empty())
{
cout << q.front() << " ";//取队头元素
q.pop();//删除队头元素
}
cout << endl;
}
(6)deque(双端队列)
deque的接口:http://www.cplusplus.com/reference/deque/deque/?kw=deque
deque简介:
deque是一种双向开口的连续线性空间,可以在头和尾两端分别做元素的插入和删除操作。
deque底层结构
deque是一段假想的连续空间,与vector不同。deque由一段一段定量的连续空间
构成,一旦有必要再deque的前端或尾端增加新空间,便配置一段定量连续空间,
串接在整个deque的头端和尾端,而deque的任意就是:在分段的定量连续空间上
维护其连续的假象。
首先,创建一个中控器(数组),然后从中控器的中间开始,先动态开辟出一个buffer,使迭代器的first指向该buffer的首地址,last指向该buffer最后一个空间地址的下一个,每次尾插时,判断cur是否等于last,如果不等于,只需给cur指向的空间赋值,让cur向后走一步,如果等于,在动态开辟一个buffer,让迭代器的node 往后走一步,再给cur指向的空间赋值。 每次头插时,判断cur是否 等于first,如果不等于,只需给cur指向的空间赋值,让cur向前走一步,如果等于,再动态开辟一个buffer,让迭代器的node 往前走一步,再给cur指向的空间赋值。每次动态开辟buffer的大小是固定的。