接触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:给定一个链表,如果有环路,找出环路的起始点。
输入是一个链表,输出是链表的一个节点,如果没有环路,返回一个空指针
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;
}
#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(); // 删除集合中的某个元素
#include // 头文件
queue q; // 申请队列
q.push(value); // 入队
q.pop(); // 出队
q.top(); // 返回队首元素
q.empty(); // 判断是否为空
q.size(); // 返回队列个数
#include // 头文件
stack stk; // 申请栈
stk.push(value); // 入栈
stk.pop(); // 出栈
stk.top(); // 返回栈顶元素
stk.empty(); // 判断是否为空栈
#include // 头文件
//常用命令
vectorvec; // 申请一个vector容器,这里int也可以是其他数据类型
vec.push_back(num); // 向容器最后插入一个数num
vec.size(); // 查询目前容器的大小,常用于遍历
//二维数组
vectorvec[100]; // 申请100个不定长容器
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的元素。
#include
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