C++双指针

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

目录

双指针

指针与常量

指针函数与常量

合并两个数组

快慢指针

常用STL库

set集合

queue

stack

vector

deque

map

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

结构体

定义与声明

结构体初始化方法

结构体嵌套


双指针

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

指针与常量

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

指针函数与常量

// addition是指针函数,一个返回类型是指针的函数
int* addition(int a, int b) {
int* sum = new int(a + b);//分配内存
return sum;
}
int subtraction(int a, int b) {
return a - b;
}
int operation(int x, int y, int (*func)(int, int)) {
return (*func)(x,y);
}
// minus是函数指针,指向函数的指针
int (*minus)(int, int) = subtraction;
int* m = addition(1, 2);
int n = operation(3, *m, minus);

合并两个数组

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

void merge(vector& nums1, int m, vector& nums2, int n) {
    int pos = m-- + n-- - 1;
    while (m >= 0 && n >= 0) {
    nums1[pos--] = nums1[m] > nums2[n]? nums1[m--]: nums2[n--];
    }
    while (n >= 0) {
    nums1[pos--] = nums2[n--];
    }
}

快慢指针

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

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

C++双指针_第1张图片

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

struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x):val(x),next(nullptr){}
};

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

ListNode *detectCycle(ListNode *head){
    ListNode *slow=head,*fast=head;
    //判断是否存在环路
    do{
        if(!fastt||!fast->next) return nullptr;
        fast=fast->next->next;
        slow=slow->next;
    }while(fast!=slow);
    //如果存在,查找环路节点
    fast=head;
    while(fast!=slow){
        slow=slow->next;
        fast=->fast->next;
    }
    return fast;
}

常用STL库

set集合

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

queue

#include // 头文件
queue  q; // 申请队列
q.push(value); // 入队
q.pop(); // 出队
q.top(); // 返回队首元素
q.empty(); // 判断是否为空
q.size(); // 返回队列个数

stack

#include // 头文件
stack  stk; // 申请栈
stk.push(value); // 入栈
stk.pop(); // 出栈
stk.top(); // 返回栈顶元素
stk.empty(); // 判断是否为空栈

vector

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

deque

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

map

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

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

结构体

定义与声明

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

struct Student
{
    int Code;
    char Name[20];
    char Sex;
    int Age;
};
struct Student Stu;
struct Student StuArray[10];
struct Student *pStru;

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

struct Student
{
    int Code;
    char Name[20];
    char Sex;
    int Age;
}Stu,StuArray[10],*pStu;

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

​
typedef struct
{
    int Code;
    char Name[20];
    char Sex;
    int Age;
}student;
Student Stu,Stu[10],*pStu;

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

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

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

#include 

using namespace std;

struct Student
{
    int Code;
    char Name[20];
    char Sex;
    int Age;
}Stu,StuArray[10],*pStu;

int main(){

    Student *s = new Student();  // 或者Student *s = new Student;
    s->Code = 1;
    cout<Code;

    delete s;
    return 0;
}

结构体初始化方法

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

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

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

struct node{
    int data;
    string str;
    char x;
    //注意构造函数最后这里没有分号哦!
  node() :x(), str(), data(){} //无参数的构造函数数组初始化时调用
  node(int a, string b, char c) :data(a), str(b), x(c){}//有参构造
};




//结构体数组声明和定义
struct node{
    int data;
    string str;
    char x;
    //注意构造函数最后这里没有分号哦!
  node() :x(), str(), data(){} //无参数的构造函数数组初始化时调用
  node(int a, string b, char c) :data(a), str(b), x(c){}//初始化列表进行有参构造
}N[10];

结构体嵌套

struct Costs
{
    double wholesale;
    double retail;
};

struct Item
{
    string partNum;
    string description;
    Costs pricing;
}widget;

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

你可能感兴趣的:(C++,周总结,c++,算法)