当前位置:   article > 正文

C++双指针_c++中用到双指针需要什么头文件

c++中用到双指针需要什么头文件

接触C++的第二周(这周的事情有点多,原本的计划暂时没有完成,会尽快补上)

目录

双指针

指针与常量

指针函数与常量

合并两个数组

快慢指针

常用STL库

set集合

queue

stack

vector

deque

map

pair​​​​​​大家可以查看这个网站,总结的挺好

结构体

定义与声明

结构体初始化方法

结构体嵌套


双指针

  • 双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务
  • 若两个指针指向同一数组,遍历方向相同且不会相交,也成为滑动窗口
  • 若指向同一数组,但是遍历方向相反,则可用来进行搜索

指针与常量

  1. int x;
  2. int *p1=&x;//指针可以被修改,值也可以被修改
  3. const int *p2=&x;//值不可修改
  4. int * const p3 =&x;//指针不可被修改
  5. const int * const p4 =&x;//皆不可修改

指针函数与常量

  1. // addition是指针函数,一个返回类型是指针的函数
  2. int* addition(int a, int b) {
  3. int* sum = new int(a + b);//分配内存
  4. return sum;
  5. }
  6. int subtraction(int a, int b) {
  7. return a - b;
  8. }
  9. int operation(int x, int y, int (*func)(int, int)) {
  10. return (*func)(x,y);
  11. }
  12. // minus是函数指针,指向函数的指针
  13. int (*minus)(int, int) = subtraction;
  14. int* m = addition(1, 2);
  15. int n = operation(3, *m, minus);

合并两个数组

eg:输入两个数组及其长度m,n,第一个数组长度被扩展到m+n,多出的n位用0填补,要求将第二个数组归并到第一个数组上,不需要开辟额外空间

  1. void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
  2. int pos = m-- + n-- - 1;
  3. while (m >= 0 && n >= 0) {
  4. nums1[pos--] = nums1[m] > nums2[n]? nums1[m--]: nums2[n--];
  5. }
  6. while (n >= 0) {
  7. nums1[pos--] = nums2[n--];
  8. }
  9. }

快慢指针

eg:给定一个链表,如果有环路,找出环路的起始点。

输入是一个链表,输出是链表的一个节点,如果没有环路,返回一个空指针

 2为环路的开始点,采用下面的数据表示链表

  1. struct ListNode{
  2. int val;
  3. ListNode *next;
  4. ListNode(int x):val(x),next(nullptr){}
  5. };

给定两个指针,起始位置在链表开头,前进步数设为不同,若存在环路,肯定会有相遇问题,当他们第一次相遇时,将快指针重新移动到链表开头,并让快和慢每次都前进一步,当第二次相遇时,相遇节点即为环路的开始点

  1. ListNode *detectCycle(ListNode *head){
  2. ListNode *slow=head,*fast=head;
  3. //判断是否存在环路
  4. do{
  5. if(!fastt||!fast->next) return nullptr;
  6. fast=fast->next->next;
  7. slow=slow->next;
  8. }while(fast!=slow);
  9. //如果存在,查找环路节点
  10. fast=head;
  11. while(fast!=slow){
  12. slow=slow->next;
  13. fast=->fast->next;
  14. }
  15. return fast;
  16. }

常用STL库

set集合

  1. #include<set> // 头文件
  2. set<int>st; // 申请一个集合st
  3. st.begin(); // 返回set容器的第一个元素
  4. st.end(); // 返回set容器的最后一个元素
  5. st.clear(); // 删除set容器中的所有的元素
  6. st.empty(); // 判断set容器是否为空
  7. st.max_size(); // 返回set容器可能包含的元素最大个数
  8. st.size(); // 返回当前set容器中的元素个数
  9. st.insert(); // 在集合中插入元素
  10. st.erase(); // 删除集合中的某个元素

queue

  1. #include<queue> // 头文件
  2. queue <int> q; // 申请队列
  3. q.push(value); // 入队
  4. q.pop(); // 出队
  5. q.top(); // 返回队首元素
  6. q.empty(); // 判断是否为空
  7. q.size(); // 返回队列个数

stack

  1. #include<stack> // 头文件
  2. stack <int> stk; // 申请栈
  3. stk.push(value); // 入栈
  4. stk.pop(); // 出栈
  5. stk.top(); // 返回栈顶元素
  6. stk.empty(); // 判断是否为空栈

vector

  1. #include<vector> // 头文件
  2. //常用命令
  3. vector<int>vec; // 申请一个vector容器,这里int也可以是其他数据类型
  4. vec.push_back(num); // 向容器最后插入一个数num
  5. vec.size(); // 查询目前容器的大小,常用于遍历
  6. //二维数组
  7. vector<int>vec[100]; // 申请100个不定长容器

deque

  1. deque();//创建一个空双向队列
  2. deque( size_type size );// 创建一个大小为size的双向队列
  3. deque( size_type num, const TYPE &val ); //放置num个val的拷贝到队列中
  4. deque( const deque &from );// 从from创建一个内容一样的双向队列
  5. deque( input_iterator start, input_iterator end );
  6. // start 和 end - 创建一个队列,保存从start到end的元素。

map

  1. #include <map> // STL头文件没有扩展名.h
  2. begin()//返回指向 map 头部的迭代器
  3. clear()//删除所有元素
  4. count()//返回指定元素出现的次数
  5. empty()//如果 map 为空则返回 true
  6. end()//返回指向 map 末尾的迭代器
  7. equal_range()//返回特殊条目的迭代器对
  8. erase()//删除一个元素
  9. find()//查找一个元素
  10. get_allocator()//返回map的配置器
  11. insert()//插入元素
  12. key_comp()//返回比较元素key的函数
  13. lower_bound()//返回键值>=给定元素的第一个位置
  14. max_size()//返回可以容纳的最大元素个数
  15. rbegin()//返回一个指向map尾部的逆向迭代器
  16. rend()//返回一个指向map头部的逆向迭代器
  17. size()//返回map中元素的个数
  18. swap()//交换两个map
  19. upper_bound()返回键值>给定元素的第一个位置
  20. value_comp()//返回比较元素value的函数

pair​​​​​​大家可以查看这个网站,总结的挺好

结构体

定义与声明

1.先定义结构体类型再单独进行变量定义

  1. struct Student
  2. {
  3. int Code;
  4. char Name[20];
  5. char Sex;
  6. int Age;
  7. };
  8. struct Student Stu;
  9. struct Student StuArray[10];
  10. struct Student *pStru;

2.紧跟在结构体类型说明之后进行定义

  1. struct Student
  2. {
  3. int Code;
  4. char Name[20];
  5. char Sex;
  6. int Age;
  7. }Stu,StuArray[10],*pStu;

3.在说明一个无名结构体变量的同时直接进行定义

  1. typedef struct
  2. {
  3. int Code;
  4. char Name[20];
  5. char Sex;
  6. int Age;
  7. }student;
  8. Student Stu,Stu[10],*pStu;

4.使用new动态创建结构体变量

使用new动态创建结构体变量时,必须是结构体指针类型。访问时,普通结构体变量使用使用成员变量访问符".",指针类型的结构体变量使用的成员变量访问符为"->"

注意:动态创建结构体使用后有delete

  1. #include <iostream>
  2. using namespace std;
  3. struct Student
  4. {
  5. int Code;
  6. char Name[20];
  7. char Sex;
  8. int Age;
  9. }Stu,StuArray[10],*pStu;
  10. int main(){
  11. Student *s = new Student(); // 或者Student *s = new Student;
  12. s->Code = 1;
  13. cout<<s->Code;
  14. delete s;
  15. return 0;
  16. }

结构体初始化方法

1.利用结构体自带的默认构造函数

2.利用带参数的构造函数

3.利用默认无参的构造函数

  1. struct node{
  2. int data;
  3. string str;
  4. char x;
  5. //注意构造函数最后这里没有分号哦!
  6. node() :x(), str(), data(){} //无参数的构造函数数组初始化时调用
  7. node(int a, string b, char c) :data(a), str(b), x(c){}//有参构造
  8. };
  9. //结构体数组声明和定义
  10. struct node{
  11. int data;
  12. string str;
  13. char x;
  14. //注意构造函数最后这里没有分号哦!
  15. node() :x(), str(), data(){} //无参数的构造函数数组初始化时调用
  16. node(int a, string b, char c) :data(a), str(b), x(c){}//初始化列表进行有参构造
  17. }N[10];

结构体嵌套

  1. struct Costs
  2. {
  3. double wholesale;
  4. double retail;
  5. };
  6. struct Item
  7. {
  8. string partNum;
  9. string description;
  10. Costs pricing;
  11. }widget;

可参考https://blog.csdn.net/xiaoqi44325234/article/details/85323787

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/628738
推荐阅读
相关标签
  

闽ICP备14008679号