C++知识点总结
1. 迭代器
看实例学迭代器
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> container; //int代表容器中数据的类型
for (int i = 1; i <= 4; i++)
container.push_back(i);
vector<int>::iterator p;
for (p = container.begin(); p != container.end(); p++)
cout << *p << " ";
cout << endl;
cout << "逆向迭代器的使用:" << endl;
vector<int>::reverse_iterator q;
for (q = container.rbegin(); q != container.rend(); q++)
cout << *q << " ";
cout << endl;
cout << "容器中元素的随机访问:" << endl;
p = container.begin();
cout << "输出容器中第三个数据元素:" << container[3] << endl;
cout << "输出容器中第三个数据元素:" << p[3] << endl;
cout << "输出容器中第三个数据元素:" << *(p + 3) << endl;
p = container.begin();
++p;
cout << "输出第二项:" << *p << endl;
p++;
cout << "输出第三项:" << *p << endl;
--p;
cout << "输出第二项:" << *p << endl;
cout << "向容器中重新赋值为0:" << endl;
for (p = container.begin(); p != container.end(); p++)
*p = 0;
for (p = container.begin(); p != container.end(); p++)
cout << *p << " ";
cout << endl;
return 0;
}
运行结果:
迭代器算法总结:
(1)迭代器特点
- 迭代器,经常用指针来实现,每个容器类都有自己的迭代器类型。
- 迭代器是和容器配合使用的对象,允许访问容器中的元素。
- 自增++,将迭代器跳到下一个数据项。
- 自减–,将迭代器跳到上一个数据项。
- ==,!=判断两个迭代器是否指向同一个数据位置(同一元素)p1 == p2。
- P是迭代器变量,*p:访问位于p处的数据(由p指向的数据)。
(2)函数
- P=container.begin():返回容器container的迭代器p,并指向容器container的第一个数据项。
- container.end():迭代器的末尾,最后一个数据项之后的位置。
- container.rbegin():返回一个迭代器,定位到容器最后一个元素。
- container.rend():返回一个迭代器,定位到第一个元素之前的位置。
- container.size():返回容器中的元素个数。
- container.push_back():将元素插入序列尾。
- container.push_front():将元素插入序列首。
- container.clear():删除容器中的所有元素。
注:
rbegin和rend函数只能结合reverse_iterator使用;随机访问元素时,下标默认从0开始。
注:
p[3]或*(p+3)不会改变p中迭代器的值,但是++ 或 - - 会改变迭代器的值(迭代器指向的数据元素改变)。
(3)迭代器的种类(每种又划分为常量和变量)
- 正向迭代器:++
- 双向迭代器:++ –
- 随机访问迭代器:++ – 随机访问元素 如:vector
- 常量迭代器:提领操作符 ( * )会生成元素的只读版本,可以把* p的值赋值给变量,或者把它输出到屏幕;不能通过向* p赋值来改变容器的值;声明方式:vector< int >::const_iterator p;
- 可变迭代器:能通过向* p赋值来改变容器的值。(vector向量迭代器)
注:
对容器来说,若有常量迭代器,则无法获得可变迭代器;若有可变迭代器,也可以获得常量迭代器。
2. 容器
(1)容器的特点
- 每种数据结构都是一个模板类,如队列,栈(容纳数据),有一个参数指定存储数据的类型。
- 一个容器就是一些特定类型对象的集合。
- 顺序容器:为程序员提供了控制元素存储和访问顺序的能力。双链表list模板类、单链表slist、vector、deque(双端队列,任何一端增加删除数据)、array、string。
- 顺序容器的编码同1中算法类似。
// 列表模板类 // 把list换为vector同样可以操作
#include <iostream>
#include <list>
Using namespace std;
int main()
{
list<int> list_object;
for (int i = 1; i <= 3; i++)
list_object.push_back(i);
cout << "List contains:" << endl;
list<int>::iterator p;
for (p = list_object.begin(); p != list_object.end(); p++)
cout << *p << " ";
cout << endl;
cout << "Setting entries:" << endl;
for (p = list_object.begin(); p != list_object.end(); p++)
*p = 0;
cout << "Now list contains:" << endl;
for (p = list_object.begin(); p != list_object.end(); p++)
cout << *p << " ";
cout << endl;
return 0;
}
(2)顺序容器的比较
- vector:
随机访问迭代器
,可变大小数组,通过下标支持快速随机访问,在尾部插入和删除元素速度快。 - string:与vector相似的容器,但专门用于保存字符,在尾部插入和删除元素速度快。
- list:
双向访问迭代器
,双向链表,只支持双向顺序访问,任何位置进行插入和删除操作速度都比较快。 - array:固定大小数组。支持快速随机访问,不能添加或删除元素。
- deque:
随机访问迭代器
,双端队列,支持快速随机访问。
注:
所有这些顺序模板类都有一个析构函数供回收内存。
3. 容器适配器
(1)容器适配器特点
- 在其他类顶部实现的模板类;顺序容器的三个适配器stack、queue、priority_queue。
- 容器、函数、迭代器都有适配器,本质上,一个适配器是一种机制,能够使某种事物(容器、函数、迭代器)的行为看起来像另外一种事物(适配器)一样。
- 一个容器适配器接受一种已有的容器类型,使其行为(容器的行为)看起来像一种不同(不同于容器,是容器适配器)的类型。
- Stack<int,vector < int > > //指定基础容器为vector;容器vector的适配器stack。
(2)stack模板类
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack<char> stack_data;
cout<<"stack初始化数据:"<<endl;
char text;
cin.get(text);
while(text!='\n')
{
stack_data.push(text);
cin.get(text);
}
cout<<"输出stack数据:"<<endl;
while(!stack_data.empty())
{
cout<<stack_data.top();
stack_data.pop();
}
cout<<endl;
return 0;
}
输出结果:符合栈数据特点:先进后出。
函数:
- cin.get(text):键盘输入字符新数据。
- stack_data.push(text):数据入栈。
- stack_data.pop():数据出栈。
- stack_data.empty():判断栈空。