C++学习笔记

本文提供了一篇关于C++学习的概述性笔记,涵盖了头文件、声明语句、数据类型、数学函数、功能函数、标准库、计时方式、主函数、信任迭代器等内容,帮助读者系统地了解C++的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、头文件

1、mex.h

#include "mex.h"

如果想在Matlab中,以Matlab函数的方式调用C程序,那就要用到MEX文件

2、matrix.h

#include "matrix.h"

这个类数据类型是double,包含了常用的矩阵计算

3、string

里面是一些字符串处理函数,注意这个string与string.h完全是两个文件,之间没有关联,这样定义是因为C中已有一个string.h的库文件,而C++是需要兼容C中的库,所以用另外一种特殊方式导入这个文件:

#include <string>

4、iostream

#include <iostream>

iostream 的意思是输入输出流。#include是标准的C++头文件,任何符合标准的C++开发环境都有这个头文件。
同时,还有一个iostream.h文件,它是input output stream的简写,意思为标准的输入输出流头文件。它包含:
(1)cin>>“要输入的内容”
(2)cout<<“要输出的内容”
这两个输入输出的方法需要#include<iostream.h>来声明头文件。
iostream.h与iostream是不同的。#include<iostream.h>是在旧的标准C++中使用。在新标准中,用#include。

5、omp.h

#include "omp.h"

OpenMP编译必须包含头文件<omp.h>.
OpenMP是用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案(Compiler Directive) 。

6、stdlib.h

stdlib.h头文件即standard library标准库头文件。里面定义了五种类型、一些宏和通用工具函数。
类型例如:size_t、wchar_t、div_t、ldiv_t和lldiv_t;
宏例如:EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等;
常用函数如:malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。

7、sys/time.h

sys/time.h 是Linux系统的日期头文件。 但sys/time.h 通常会包含include “time.h”。

8、stdio.h

stdio 就是指 “standard input & output"(标准输入输出),所以,源代码中如用到标准输入输出函数时,就要包含这个头文件!例如c语言中的 printf(“%d”,i); scanf(“%d”,&i);等函数。

9、string.h

在使用到字符数组时需要使用。string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。

10、time.h

事件相关的头文件

11、math.h

数学计算相关函数的头文件,例如:绝对值、取整和取余、三角函数、反三角函数、双曲三角函数、指数和对数、标准化浮点数、多项式、数学错误计算处理等等。

二、声明语句

1、using namespace std

namespace:是指标识符的各种可见范围。是C++语言特别重要的特性,当使用第三方供应商提供的库时,为了避免与其他供应商或者用户定义的名字相冲突(命名空间污染),常常将库的内容放置在自己独立的命名空间中。
std:就是C++标准程序库中定义所有标识符的namespace。
详细解释 参考文章

2、typedef unsigned char byte

 typedef unsigned char byte;

在这个说明以后就可以在程序中用BYTE 代替unsigned char了,只是为了编写代码方便而已!因为typedef是变量类型定义命令,这句话的意思就是将unsigned char类型重新定义为byte,相当于为了简便重新给变量的这种类型命名。
在C/C++中char 表示一个字符变量,占8位,但是可以解释为int型的整数。unsigned char表示 0~255 的整数或者对应的字符。

3、enum

enum是计算机编程语言中的一种数据类型----枚举类型。在实际编程中,有些数据的取值往往是有限的,比如一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等;并为每个值取一个名字,方便在以后的代码中使用,具体语句格式为:

enum typeName{ valueName1, valueName2, valueName3, ...... };

enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, …是每个值对应的名字的列表。注意最后的分号;不能少。
应用示例代码:

#include <stdio.h>

int main(){
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
    scanf("%d", &day);
    switch(day){
        case Mon: puts("Monday"); break;
        case Tues: puts("Tuesday"); break;
        case Wed: puts("Wednesday"); break;
        case Thurs: puts("Thursday"); break;
        case Fri: puts("Friday"); break;
        case Sat: puts("Saturday"); break;
        case Sun: puts("Sunday"); break;
        default: puts("Error!");
    }
    return 0;
}

具体用法传送门

4、template

定义函数模板或者类模板。假如我们需要写一个简单的交换函数,但对于C++来说,只能做同数据类型的转换,这时我们就需要针对不同类型之间的交换分别写一个函数,十分麻烦。template就是解决这个问题的,他会告诉系统a是Int型,而b也是int型的。下面是定义方式和调用方式,这种调用swap的方式就是隐式调用方式,可以看到不同类型的值可以统一用这一个函数了,不用单独定义不同类型时的函数。

//声明时这样
template<typename T> 
void Swap(T *a, T *b)
{
    T temp = *a;
    *a = *b;
    *b = temp;
}
//调用时这样
int a=10,b=20;
float c=30,d=40;
swap(&a,&b);
swap(&c,&d);

具体用法传送门

5、#pragma unroll

在默认情形下,编译器对已知次数的小循环进行展开,#pragma unroll 可以用来控制任意一个给定的循环。但 #pragma unroll必须放在被控制的循环的前面,后面可以带展开次数选项。
后跟参数1则编译器不会展开循环。如果没有参数,并且循环次数是一常数时编译器会将循环完全展开,如果不是常数就根本不会展开。
使用示例:

int main()
{
    int a[100];
 
#pragma unroll 4
 
    for(int i=0;i<100;i++)
    {
        a[i]=i;
    }
    return 0;
}

原理解析:
通过使用#pragma unroll命令,编译器在进行编译时,遇到该命令就会对循环进行展开,比如对一些循环次数比较少的循环

for(int i=0;i<4;i++)
    cout<<"hello world"<<endl;

可以展开为:

cout<<"hello world"<<endl;
 
cout<<"hello world"<<endl;
 
cout<<"hello world"<<endl;
 
cout<<"hello world"<<endl;

这样程序的运行效率会更好,当然,现在大多数编译器都会自动这样优化,而通过使用#pragma unroll命令就可以控制编译器的对循环的展开程度。

6、#ifndef和#define

作用:防止文件被多次编译,浪费不必要的时间
参考文章

7、extern “C”

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。

三、数据类型

1、make_int2

内置的矢量类型:
char, short, int, long, longlong, float, double:
这些是从基本整数和浮点类型派生的矢量类型。 它们是结构,第一,第二,第三和第四个组件分别可以通过字段x,y,z和w访问。 它们都带有一个构造函数,形式为make_ 。
例如:

int2 make int2(int x, int y);

这条语句将创建一个类型为int2 的向量,值为(x, y).

2、__double2loint、__double2hiint

__double2loint()返回一个double的低32位
__double2hiint()返回一个double的高32位

3、const int

const int表示定义一个常量,const int与int不同的点有:
(1)const int类型一旦定义以后就不能修改,int类型是随时可以修改的。
(2)const int 定义的常量不能在其他地方被重新赋值了
例如:const int Max=100; Max++会产生错误;
(3)const int & 是返回这个数值的一个常量的引用,而int 是返回这个数值的一个拷贝。
另外const和int先后顺序可换,即const int=int const。
更多知识点传送门1 传送门2

4、uchar4类型

uchar4是在图形交互时使用的一种数据类型

5、bool success = true

定义一个布尔型变量flag并初始化为真(true)。
代码示例:

bool success = true;
if (succes) printf("balabala");

四、数学函数

1、strcmp

原型:int strcmp(const char *s1, const char *s2);
功能:用来比较两个字符串
参数:s1、s2为两个进行比较的字符串
返回值:若s1、s2字符串相等,则返回零;若s1大于s2,则返回大于零的数;否则,则返回小于零的数。

2、new float

给指针数据开辟新的内存空间

3、vector中.clear()函数

作用:删除 vector 容器中所有的元素,使其变成空的 vector 容器。该函数会改变 vector 的大小(变为 0),但不是改变其容量。其实就是保存了容器,但清空容器原本定义的大小。一般这么做是为了后边继续使用该容器?

vol.clear();

代码中vol是一个vector,clear()的作用是该容器内存储参数的大小改完0,而不是把其中所有元素清0.
具体参考博文:
https://blog.youkuaiyun.com/m0_37957160/article/details/106326379
http://c.biancheng.net/view/6846.html

4、memset

作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
函数原型

void *memset(void *str, int c, size_t n)

具体作用原理:复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。

5、hypotf

返回所传递的参数平方和的平方根
用法:
double hypot(double x, double y);
float hypot(float x, float y);
long double hypot(long double x, long double y);
在这里插入图片描述

6、atan2(y, x)

C++中的double类型反正切函数,返回值为弧度,函数功能是求点(x,y)与(0,0)形成的射线与X正半轴的夹角弧度值。一二象限为正,三四象限为负。函数返回值的范围是[-π, π],对应角度的范围是[-180, 180]度。
在这里插入图片描述
与之相似的还有atan2f(y, x)、atan2d(y, x),分别对应float类型和int类型。参考

7、取绝对值的函数

(1)abs:
用于整数数据类型(如 int、long)。
返回一个整数类型的绝对值。
不需要包含额外的头文件,通常在 或 <stdlib.h> 中定义。
(2)fabs:
用于双精度浮点数数据类型(double)。
返回一个双精度浮点数的绝对值。
需要包含 或 <math.h> 头文件。
(3)fabsf:
用于单精度浮点数数据类型(float)。
返回一个单精度浮点数的绝对值。
需要包含 或 <math.h> 头文件。

8、resize

resize(),设置大小(size);
例子:

const int nsiz_ZXY = (ZN + 1) * (XN + 1) * YN;
ZXY.resize(nsiz_ZXY);

该段代码先定义了常量整数nsiz_ZXY,取nsiz_ZXY的大小对容器ZXY的大小进行设置。
扩展传送门

9、srand((unsigned)time(NULL))

如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。 即:只需在主程序开始处调用srand((unsigned)time(NULL)); 后面直接用rand就可以了。不要在for等循环放置srand((unsigned)time(NULL));
参考文章

五、功能函数

1、dim3

封装三维数组,例如下面代码行:

dim3 blk(64, 16, 1);

定义了一个名为blk的数组,数组大小为64×16×1。

2、isNormalized

判断是否符合特定的 Unicode 范式。
示例表示判断bool是否符合特定的 Unicode 范式

bool isNormalized

3、make_float2

make_float2接收一个float类型s,返回一个float2类型,其中x和y的值都设为s。
强制类型转换,这种强制类型转换就是将float类型的数组从第零个元素开始,每两个相邻元素捏成一个float2类的对象,并且是先x后y,生成的float2类型的数组是原长度的一半。

4、inline内联函数

参考文章

5、system(“pause”);

在编写的c++程序中,如果是窗口,有时会一闪就消失了,如果不想让其消失,在程序中添加:
system(“pause”);
注意:不要再return 的语句之后加,那样就执行不到了。

6、dynamic_cast 类型转换操作符

参考文章

7、push_back函数

将一个新的元素加到vector的最后面,位置为当前最后一个元素的下一个元素。

//在容器中添加10
int num = 10;
vector<int> vec;
vec.push_back(num);

六、std

1、std::cerr与std::cout的不同

cout对应于标准输出流,默认情况下是显示器。这是一个被缓冲的输出,可以被重定向。
cerr对应标准错误流,用于显示错误消息。默认情况下被关联到标准输出流,但它不被缓冲,也就是说错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。一般情况下不被重定向。
参考文章
其中::符号是作用域运算符,假如有下面的代码:

std::cout<<"两个冒号代码的是作用域操作符"<<std::endl;

其中的std就相当于文件夹,count就是里面的文件,<<"两个冒号代码的是作用域操作符"和<<std::endl都是参数,由<<开头表示。其中“”号内的内容就会被输出。

2、std::list

Std::list是一种支持在常量时间内插入元素和从容器中任何地方删除元素的容器。不支持快速随机访问。
详细参考

七、计时方式

1、 CLOCKS_PER_SEC

程序示例:

t1 = clock();
t2 = clock();
time =double(t2 - t1) / CLOCKS_PER_SEC;

为什么要用时间差除以CLOCKS_PER_SEC呢?
这个CLOCKS_PER_SEC是VC++6.0中time.h下宏定义的常量。其值为1000。它用来表示一秒钟会有多少个时钟计时单元。也就是说clock()将返回时钟周期,CLOCKS_PER_SEC表示一秒钟有多少个时钟周期,两者相除就得到这段时钟周期经历了多少秒钟。

八、主函数int main(int argc, char** argv)

基本是固定写法,下面是具体含义,了解即可。
int argc
这个参数用来表示你在命令行下输入命令的时候,一共有多少个参数。比方说你的程序编译后,可执行文件是test.exe,若执行命令D:\tc2>test
这个时候,argc的值是1;
但是,若执行的命令是D:\tc2>test.exe myarg1 myarg2
argc的值是3。也就是一个命令名再加上两个参数,一共三个参数。
char argv[]
这个参数用来取得你所输入的参数
D:\tc2>test,这个时候,argc的值是1,argv[0]的值是 “test”
D:\tc2>test myarg1 myarg2,这个时候,argc的值是3,argc[0]的值是”test”,argc[1]的值是”myarg1”,argc[2]的值是”myarg2”。

九、trust迭代器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值