目录
Stack的总结
1.特点
1)stack是一种“先进后出(FILO)”数据结构。不允许被遍历,没有迭代器。
2.头文件及声明方法
#include <stack>
deque< int > mydeque(2,100);
vector< int > myvector(2,200);
stack< int > first;
stack< int > second(mydeque);
stack< int ,vector< int > > third;
stack< int ,vector< int > > fourth(myvector);
3.基本操作
stack<int> s;
s.empty();//判空
s.size();//元素个数
s.top();//返回栈顶元素的引用
s.push(const value_type& x);//进栈
s.pop();//删除栈顶元素
4.其他操作
5.数据结构实现
Set的总结
1.特点
1)set中的元素自动从小到大排序,且合并重复元素
2.头文件及声明方法
#include<set>
3.基本操作
set<int>s;
s.insert(x); //插入数值
s.clear(); //删除set容器中的所有的元素
s.empty(); //判断set容器是否为空
4.其他操作
//遍历
set<int>::iterator it;
for(it = s.begin(); it != s.end(); it++){ //s.end()没有值
printf("%d\n", *it);
}
cout<<"s.begin() "<<*s.begin()<<endl;
//lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
cout<<"lower_buond 3 "<<*s.lower_bound(3)<<endl;
//upper_bound()--返回大于某个值元素的迭代器
cout<<"upper_bound 3 "<<*s.upper_bound(3)<<endl;
//find()--返回一个指向被查找到元素的迭代器
cout<<"find(3) "<<*s.find(3)<<endl;
cout<<"s.size() "<<s.size()<<endl;
5.数据结构实现
Map的总结
参考https://www.cnblogs.com/LjwCarrot/p/8994355.html
https://www.cnblogs.com/BeyondAnyTime/archive/2012/08/24/2654353.html
https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html
1.特点
1)Map是C++的一个关联容器,它提供了很好的一对一的关系。(其中一个为关键字,每个关键字key只能在map中出现一次,第二个可称为关键字的值value)map内部自建一颗红黑树(一种严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据是有序的。
2.头文件及声明方法
#include<map>
map<string,int> mapstring;
map<int,string> mapint;
map<string,char> mapstring;
map<char,string> mapchar;
map<char,int> mapchar;
map<int,char> mapint;
3.基本操作
map<int, int> m; //初始化
//int型 默认值为0
m[1] = 5; //以数组形式插入值
m[2] = 6;
m[1]++; //可以参与运算
m[2] += 2;
cout<<m[1]<<endl;
cout<<m[2]<<endl;
4.其他操作
//
5.数据结构实现
//
Vector的总结
1.特点
vector<T>容器是包含T类型元素的序列容器,vector<T>容器的大小可以自动增长,从而可以包含任意数量的元素,只要元素超出vector当前的容量,就会自动分配更多的空间。
只能在vector容器尾部高效的删除或添加元素。可以方便灵活的代替数组存放元素。只要能够意识到,vector在扩展容量,以及在序列内部删除或添加元素时会产生一些开销;
但大多数情况下,代码不会明显变慢。
2.头文件及声明方法
#include<vector>
vector<int>a; //声明一个int型变量a
//容器中没有元素,所以没有分配空间,当添加第一个数据项时,会自动分配内存
vector<int>a(5); //声明一个初始大小为5的向量,默认值都为0
vector<int>a{5}; //只有一个元素,以5作为初值
vector<int>a(5,1); //声明一个初始大小为5且初始值都为1的向量
vector<int>b(a); //声明并用向量a初始化向量b
Vector<int>b(a.begin(),a.begin()+3);//将a向量中从第0个到第二个(共三个)作为向量b的初始值
//可以直接使用数组来初始化向量
Int=n[]={1,2,3,4,5};
vector<int>a(n,n+5); //将数组n的前五个元素作为向量a的初始值
vector<int>a(&n[1],&n[4]); //将n[1]--n[4]范围的元素作为向量a的初始值
3.基本操作
Vector<int>vec;
vec.begin() //指向迭代器中第一个元素。
vec.end() //指向迭代器中末端元素的下一个,指向一个不存在元素。
vec.push_back(elem) //在尾部加入一个数据。
vec.pop_back() //删除最后一个数据。
vec.capacity() //vector可用空间的大小。
vec.size() //返回容器中数据个数。
vec.empty() //判断容器是否为空。
vec.front() //传回第一个数据。
vec.back() //传回最后一个数据,不检查这个数据是否存在。
vec.at(index) //传回索引idx所指的数据,如果idx越界,抛出out_of_range。
vec.clear() //移除容器中所有数据。
vec.erase(iterator) //删除pos位置的数据,传回下一个数据的位置。
vec.erase(begin,end) //删除[beg,end)区间的数据,传回下一个数据的位置。注意:begin和end为iterator
vec.insert(position,elem) //在pos位置插入一个elem拷贝,传回新数据位置。
vec.insert(position,n,elem) //在pos位置插入n个elem数据,无返回值。
vec.insert(position,begin,end) //在pos位置插入在[beg,end)区间的数据,无返回值。
4.其他操作
//使用迭代器访问元素.
Vector<int>vec;
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
//普通遍历
for(int i = 0; i < v.size(); i++){
printf("%d\n", v[i]);
}
//sort排序,其中cmp部分与结构体等数据类型自定义排序时cmp相同用法
sort(vec.begin(), vec.end(), cmp);
5.数据结构实现
//稍后补充
Queue的总结
参考https://www.cnblogs.com/xuning/p/3321733.html
https://www.cnblogs.com/LjwCarrot/p/9480564.html
1.1queue特点
1)queue模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque类型。
2)先进先出(FIFO)——先进队列的元素先出队列。只能访问第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。
1.2头文件及声明方法
#include<queue>
//普通声名
queue<int> q;
//结构体声名
struct node
{
int x, y;
};
queue<node> q;
1.3基本操作
queue<string> q;
//size返回队列中元素的个数,返回值类型为unsigned int
cout<<q.size()<<endl; // 0
//empty判断队列是否为空的,如果为空则返回true
cout<<q.empty()<<endl; // 1
//push队列先进先出,所以插入到队尾
q.push("Hello World!");
q.push("China");
//front返回值为队列中的第一个元素,也就是最早、最先进入队列的元素。
cout<<q.front()<<endl; //Hello World!
//back返回队列中最后一个元素,也就是最晚进去的元素
cout<<q.back()<<endl;
//pop将队列中最靠前位置的元素拿掉,是没有返回值的void函数
q.pop();
cout<<q.front()<<endl; //China
cout<<q.size()<<endl; // 1
cout<<q.empty()<<endl; //0
1.4其他操作
//queue队列中没有clear()操作,因此清空队列有几种方法:
//直接用空队列赋值
queue<int>q1
q1=queue<int>();
//遍历出队列
while(!q.empty())
q.pop();
//使用swap,定义clear,保持STL容器的标准
void clear(queue<int>& q)
{
queue<int>empty;
swap(empty,q);
}
1.5数据结构实现
//稍后补充
2.1优先队列特点
1)优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。
2)但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大互小的顺序排序。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。
2.2头文件及声明方法
#include <queue>
//普通声名
priority_queue<Type, Container, Functional>
//Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
priority_queue<int>q; //通过操作,按照元素从大到小的顺序出队
priority_queue<int,vector<int>, greater<int> >q; //通过操作,按照元素从小到大的顺序出队
//自定义优先级
struct cmp {
operator bool ()(int x, int y)
{
return x > y; // x小的优先级高 //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
}
};
priority_queue<int, vector<int>, cmp>q; //定义方法
//其中,第二个参数为容器类型。第三个参数为比较函数。
//结构体声名
struct node {
int x, y;
friend bool operator < (node a, node b)
{
return a.x > b.x; //结构体中,x小的优先级高
}
};
priority_queue<node>q; //定义方法
//在该结构中,y为值, x为优先级。
//通过自定义operator<操作符来比较元素中的优先级。
//在重载”<”时,最好不要重载”>”,可能会发生编译错误
2.3基本操作
//empty() 如果队列为空返回真
//pop() 删除对顶元素
//push() 加入一个元素
//size() 返回优先队列中拥有的元素个数
//top() 返回优先队列对顶元素
//在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。
2.4数据结构实现
//稍后
3.1deque特点
3.2头文件及声明方法
3.3基本操作
3.4其他操作
3.5数据结构实现
putchar and getchar
参考链接:https://zhuanlan.zhihu.com/p/161237789
1.putchar:将一个字符输出到标准输出终端。
getchar:从标准输入里读取下一个字符。
2.头文件:<stdio.h>
3.用法:
格式:putchar(c)
- 当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符);
#include<stdio.h> int main() { putchar('a'); putchar('b'); putchar('c'); putchar('1'); putchar('2'); putchar('3'); } //输出结果:abc123
- 当c为一个介于0~127(包括0及127)之间的十进制整型数时,(此时没有单引号引起来)它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符;
#include<stdio.h> int main() { putchar(65); putchar(97); putchar(48); } //输出结果:Aa0
- 当c为一个事先用char定义好的字符型变量时,(此时没有单引号引起来),输出该变量所指向的字符。
#include<stdio.h> int main() { char ch1='a'; char ch2=97; putchar(ch1); putchar(ch2); } //输出结果:aa
格式:getchar()
- getchar()当程序调用getchar时,程序等待用户输入。用户输入的字符将被存放在键盘缓存区中,直到用户按回车键为止(回车字符也放在缓存区中)。当用户键入回车,getchar才开始从stdin流中每次读入一个字符。getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1且将用户输入的字符回显到屏幕。
- getch()
- getche()