【知识总结】C++编程易忘的使用方法

函数

传参

1. 分清修改的是参数对象本身,还是参数对象指向的对象。

例如下面代码中,从fun中出来以后的指针对象n还是原来的值。

要想改变指针对象,得传进node**。要想改变指针对象指向的对象,在fun里修改时要用*n = ...。

void fun(node* n){
    node* m;
    ...
    n = m;
    return;
}
void main(){
    node* n;
    fun(n);
}

2. 数组

数组传参的时候本来传的就是地址,不用再写成&了。此时在函数体内对数组修改,会影响函数外。

 

一个坑:

.size()函数的返回值是size_type类型,实际上是一个unsigned类型,如果把它和负的int比较,int会先转换成unsigned int再比较,会出错。示例:

int a = -1, b = -5;
vector<int> vec = {1,2,3};
cout<< (a > vec.size()) <<endl;    // 结果是1.
cout<< (b > vec.size()) <<endl;    // 结果是1.
cout<< (unsigned int)a <<endl;    // 结果是4294967295.
cout<< (unsigned int)b <<endl;    // 结果是4294967291.

 

定义

成员变量和函数参数同名的赋值:

this->val = val;

 

数据类型

数组

1.初始化

不初始化,int数组里元素就是随机值:

int a[3];    // 结果:0 -272632272 32766 
bool a[3];    // 结果:false,true,false

以下代码只能初始化第一个元素,后面未初始化的元素就是0:

int a[3] = {3};    // 结果:3,0,0
bool a[3] = {false};    // 结果:true,false,false

2. memset

以下代码并不能完成对数组所有元素初始化为1:

int a[5];
memset(a, 1, sizeof(a));  //结果: 16843009 16843009 16843009 16843009 16843009 

原因:不管数组是什么类型的,memset都是按位赋值。

对于int数组,一个int有4位,用memset时也是每一位都赋值位1,因此会出错。int数组只有在赋0或-1是才有正常效果。

对于char数组,一个char有1位,因此可以赋任意char型的值。

3.拷贝

int a[3] = {1,2,3};
int b[3];
memcpy(b, a, 3*sizeof(int));

 

string

!string用双引号"",char用单引号' '。

头文件:<string>

用下标s[0]取出来的结果类型为char。

判空方法

1、string类的成员函数empty,返回true为空。

string str;
if(str.empty())    //成立则为空
...

2、判断字符串长度。如果长度为0,则为空。

string str;
if(str.size()==0)    //成立则为空
...

3、与空串比较,如果相等则为空。

string str;
if(str=="")    //成立则为空
...

子串

参考:https://www.cnblogs.com/catgatp/p/6407788.html

!注意:c++的string没有split函数

取子串:s.substr(开始位置,取的长度)

替换子串:s.replace(开始位置,替换长度,新子串)

类型转换

1.string与int

string to int:atoi(s.c_str)

int to string:to_string(int n)

参考这篇博客:https://blog.csdn.net/xiong452980729/article/details/61677701

2.char与int

char to int:

char c = '1';
int n = c - '0';

int to char:

int n = 1;
char c = c + '0';

vector

参考:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html

!一个坑:同样是记录2个int,vector使用空间大于pair,递归次数很大时,vector可能导致stack_overflow。所以能用pair就pair。

1.声明

vector<int> v;

2.添加元素

加到尾部:puch_back(值)

加到其他位置:insert(位置,值)。

res.insert(res.begin(), 2)

加一段vector:insert(位置,起始位置,结束位置)

3.初始化

vector<int> v(长度,初始值)    

vector<int> v(10, 0);

4.查找

vector中没有定义find函数,需要借助algorithm库里的find来实现。

find(vec.begin(), vec.end(), 6);

5.取末尾元素值

vec.back();

pair

头文件:<iostream>

参考:https://blog.csdn.net/sinat_35121480/article/details/54728594

!一个坑:同样是记录2个int,vector使用空间大于pair,递归次数很大时,vector可能导致stack_overflow。所以能用pair就pair。

1.声明

pair<数据类型,数据类型> p    例如pair<int,int> p

2.访问

第一个值:p.first

第二个值:p.second

 

priority_queue

默认是降序排列,定义的是<。

改为升序则需要传入3个参数:

priority_queue<int, vector<int>, greater<int>> pq;

第二个参数是数据存储方式,第三个参数是代表升序。less<int>在pq中是降序。

1. 自定义比较方式

参考:https://blog.csdn.net/AAMahone/article/details/82787184

struct node{
    int x, y;
    node(int x, int y):x(x),y(y){}
};

struct cmp{
    bool operator()(node a, node b){
        if(a.x == b.x)  return a.y >= b.y;
        else return a.x > b.x;
    }
};

priority_queue<node, vector<node>, cmp> qp;

 

map

默认是升序,less<int>,定义<。

参考资料:https://riptutorial.com/zh-CN/cplusplus/example/13316/%E7%94%A8std----map%E6%8E%92%E5%BA%8F-%E5%8D%87%E5%BA%8F%E5%92%8C%E9%99%8D%E5%BA%8F-

1.初始化直接赋值:用列表形式

unordered_map<string, vector<char>> letter = {
        {"2",{'a','b','c'}},
        {"3",{'d','e','f'}},
        {"4",{'g','h','i'}},
        {"5",{'j','k','l'}},
        {"6",{'m','n','o'}},
        {"7",{'p','q','r','s'}},
        {"8",{'t','u','v'}},
        {"9",{'w','s','y','z'}}
    };

 

2.自定义比较函数 & 按value排序

参考资料:https://blog.csdn.net/Shrimp_millet/article/details/93885695

一些库函数

错误提示

assert(表达式):当表达式为false时,想stderr打印错误信息,调用abort终止程序。

参考:https://blog.csdn.net/yunzhongguwu005/article/details/9178911

数字处理

ceil(n):大于等于n的最小整数

floor(n):小于等于n的最大整数

初始化

memset(容器指针, 初始化值, 容器长度) 

eg. memset(arr, 0, sizeof(int)*10)

排序

1.sort(开始位置,结束位置(不参加排序),比较方法):从小到大排序

eg. sort(vec.begin(), vec.end()),从大到小排序的话改传反向指针,就能反向排序,sort(vec.rbegin(), vec.rend())

2. 自定义排序方法

例子:按字符串长度排序

vector<string> words = {"abc","dweg","en","al"};
sort(words.begin(),words.end(),[](string &a, string &b){ return a.size()>b.size(); });    
// {"dweg","abc","en","al"}

求和

accmulate(开始位置,结束位置(不参加求和),求和起始值):计算从开始位置到结束位置的和

头文件:<numeric>

数组iterator

begin(数组):数组第一个元素的指针。

end(数组):数组最后一个元素后面的指针。

int a[] = {1,2,3};
auto iter = begin(a);    // *iter = 1;

参考:http://www.cplusplus.com/reference/iterator/

反转

reverse(开始位置,结束位置(不参与)):将容器中 [开始位置,结束位置) 的元素顺序反转。

可用于vector,数组,string中。示例:

vector<int> vec = {1,2,3};
int arr[] = {1,2,3};
string s = "123";
reverse( vec.begin(), vec.end());    // {3,2,1}
reverse( begin(arr), end(arr));      // {3,2,1}
reverse( s.begin(), s.end());        // "321"

头文件: <algorithm>

参考:https://zh.cppreference.com/w/cpp/algorithm/reverse

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值