c/c++

3 篇文章 0 订阅

#c/c++

  • #####头文件

    • stdio.h

    c语言的标准输入输出,常用printf;scanf

    • iostream

    c++语言的标准输入输出,重用cin;cout

    • algorithm

    c++的常用算法头文件,如sort;qsort

  • #####数组处理

    • memcpy

    数组a复制k个元素到数组b:memcpy(b,a,sizeof(int)*k);

    数组a全部复制到数组b:memcpy(b,a,sizeof(a));

    • memset

      数组a清0:```
      memset(a,0,sizeof(a));

    >
    >这里注意一点,memset对int数组赋初值时**只能赋值0**,其他数都不能赋值,++因为memset赋值的单位是字节,而int是4个字节,所以你赋值0,每字节都是0.所以合起来4个字节也是0,但是赋值其他的数,4个字节合起来就不是原来的数了++。(所以memset大多用来给char数组赋初值,因为char是一个字节)

* #####数学计算
 + pow
   >```pow(double a,double b);```
   >头文件:```<math.h>```
   > 功能:计算a的b次方

* #####字符处理
  + sprintf
    >printf输出到屏幕,fprintf输出到文件,sprintf输出到字符串

    >```sprintf(a,"%d%d%d",a,b,c);
```//a为字符串数组
  + tolower
   > 格式:int tolower(int c)
   > 将大写字符转化为小写,***非字母字符不做处理 ***
   > 头文件:ctype.h或stdlib.h或iostream或string(4个貌似都可以..)
  + strcmp
   > ```int strcmp(const char *s1, const char *s2);```
   > 【功能】:比较两个字符串的大小
   > 【规则】:字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。
   >【返回值】:若参数s1 和s2 字符串相同则返回0。s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。
   >
   >【注意1】:如果s1和s2长度不相等且s1是s2的子串,则s1<s2,即```strcmp(s1,s2)<0```
   >
   >【注意2】:另外,这个函数在某些编译器上只返回-1,0,1三个值,并不是规定的返回值。所以一般用    <0,>0,=0来判断。
  + string对象(c++)
   > string是c++中的字符对象,头文件```<string>```。处理数组比c语言要方便很多,有几个常用的方法:
   > 1. ```
erase(int a,int b)
```:从下标a起删除b个字符
   > 2. ```
find(string)
```:查找string出现的首下标,找不到返回std::string::npos(判断是否找到只能用s.find(str)==std::string::npos)
   > 3. ```
c_str()
```将string对象转化为c语言字符串。
   > 4. ```
size()
```返回字符串大小
   > 5. ```
substr(begin,len)
```截取字符串,从下标为begin开始,截取长度为len的字符串
   > 6. ```
replace(begin,len,str)
```从下标begin开始,长度为len的字符串替换为str
   > 7. ```
insert(begin,len)
```从下标begin开始,插入长度为len的字符串

* #####算法
 + sort
   >c++排序函数,***在std下***,时间复杂度nlogn
   >
   >第一个参数是要排序的区间首地址,第二个参数是区间尾地址的++**下一地址**++。比如有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)
   >
   >`sort(begin,end,compare(默认为升序));`
   >```bool compare(int a, int b)
      {
       return a<b;这是升序(谁小谁在前面)
      }```

* #####c++运算符重载
   >type operator sign (parameters);
   >运算符重载定义在类或结构体内,只针对此类或结构体的具体运算。
例: ```struct E{
     char name[101];
     int age;
     int score;
     E operator + (E b){
     b.age = age+b.age;
     return b;
     }
     }
    ```


   >调用:
   >```struct a;struct b;struct c;```
     1.```c = a + b;```
     2.```c=a.operator+(b);```

* #####输入(关于输入输出的细节需看我写的博客)
 + scanf
  >tip1:```scanf("%4d%3d",&a,&b)```//输入一个数取其前四位赋给a,后四位赋给b
  >
  >tip2:
  >在输入**数值数据或字符串(%d或%s)**时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用**空格,TAB或回车**作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
  >在输入**单个字符数据(%c)**时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符,这时输入时无法用空格,TAB或回车做间隔。
  >例如:
    >1. ```scanf("%c%c%c",&a,&b,&c);```输入d e f则把'd'赋予a,' ' 赋予b,'e'赋予c。只有当输入为def时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
    >2. 如果在**格式控制中加入空格作为间隔**,如:
    ```scanf ("%c %c %c",&a,&b,&c);```
    则输入时各数据之间可加空格。
    >3. 以%s输入字符串时可以以空格tab或回车做结束,如:
    ```char a[10],b[10];
       scanf ("%s%s",a,b);```
    则输入时各数据之间可加空格或回车。
  >
  >tip3:
  >scanf的格式控制部分分为三部分:1格式化说明符,2空白符,3非空白符
    >1. 格式化说明符比如%s,%c;
    >2. 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。
    >3. 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
 + getchar
  >getchar函数的返回值是用户输入的字符的ASCII码,如出错返回-1.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。
  >**注:回车符和空格都是字符,所以也会被getchar吸收,所以经常用getchar吸收多余的回车符。**
 + gets
 >```
 gets(a)
 ```是输入一个字符串,存入a.以回车做为结束,但是不以空格结束,这是和scanf的不同.和scanf的相 同点是字符串接受结束后自动加'\0'.

 >例:
 >
```#include <stdio.h>
    main()
    {
    char ch1[10],ch2[10],c1,c2;
    scanf("%s",ch1);
    c1=getchar();
    gets(ch2);
    c2=getchar();
    }

依次键入asdfg回车,asdfg回车,则ch1=“asdfg\0”,c1=’\n’,ch2=“asdfg\0”,c2需再次输入。
++scanf++ :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,只读取回车空格tab之前的字符。但是回车,空格和tab键仍会留在输入的缓冲区中。
++gets++:可接受包括回车符以及之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中,因为gets会把回车一起读入,并用’/0’替换。

  • cin

这个是c++中的输入,头文件为```

 >cin和scanf一样,输入的回车和空格可认为停止输入,不会读取,但都会保留在缓冲区内,需要吸收。而gets读取空格,且只以回车为结束标志。
 >***注意***:==cin比scanf耗时很多,所以许多比赛建议用scanf而不是cin==
* #####输出
 + puts
  >1.puts()函数只用来输出字符串(结尾必须有'\0').没有格式控制,里面的参数可以直接是字符串或者是存放字符串的字符数组名。而printf()函数的输出格式很多,可以根据不同格式加转义字符,达到格式化输出。
  >2.puts()函数的作用与语句printf("%s\n",s);的作用形同,**即自动在最后加上换行符**。
 + cout
  >cout输出和c的输出不太一样,他是带缓存的,只有缓存满时才输出,利用endl就是直接输出,清空缓存。
  >endl的作用:
    1. 将换行符写入输出流,其中Unix/Linux换行符是\n,Windows中是\r\n,MAC中是\r;
    2. 清空输出缓冲区。
* #####宏定义
 + define
  >1.简单的宏定义```#define N n*n```
  >2.带参数的宏定义```#denfine n(x) x*x;```

* #####STL
 + stack
   > 格式:```stack<type> a```
   >1.头文件```<stack>```
   >2.方法:
   >  + ```pop()```
      取出头元素,无返回值
   >  + ```push(value)```
      插入元素
   >  + ```top()```
      返回栈顶元素值(注意与pop区别,top是取值不出栈,pop是出栈不取值)
   >  + ```empty()```
 + queue
   > 格式:```queue<type> a```
   >1.头文件```<queue>```
   >2.方法:
   >  + ```pop()```
      取出头元素,无返回值
   >  + ```push(value)```
      插入元素
   >  + ```front()```
      返回队头元素值(注意与pop区别,front是取值不出队列,pop是出队列不取值)
   >  + ```back()```
      返回队尾元素
   >  + ```empty()```
 + vector
   > 格式:```vector<type> a/a[N]```
   >1.头文件```<vector>```
   >2.功能:常用于表示图的邻接表,其功能上相当于一个一维数组。
   >3.成员方法:
   > + ```push_back(value)```
     把元素插入末尾
   > + ```size()```
     返回元素的个数
   > + ```clear()```
     清空vector中的元素
 + priority_queue
   > 格式:```priority<type> p```
   >1.头文件```<queue>```
   >2.功能:优先队列,出队列不再是先进先出,而是优先级最高的先出。内部原理是堆(大顶堆或小顶堆)
   >3.成员方法:
   > + ```push(value)```
     把元素插入末尾
   > + ```size()```
     返回元素的个数
   > + ```pop()```
     队首元素(优先级最高)出队列
   > + ```top()```
     返回队尾元素(优先级最低)

   >注意1:```priority<int>```默认是大顶堆,```priority<int,vector<int>,greater<int> >```是建立一个小顶堆。另外,如果是结构体类型,可以在结构体中重载 '<' 号,重定义优先级。类似sort,不过和sort的 '<' 号功能正好相反。看题1416代码。

   >注意2:**top()返回的元素不能直接修改**。即类似```s.top()--```这种是错误的。只能先赋值给其他对象再修改再存进去。如```q = s.top();q--;s.pop();s.push(q);```这个规则也适合其他STL的top()函数

* #####一些方法
 + 给一个数组全赋值0的方法
  >1.memset(..);
  >2.int a[100] = {0};//这个较简便
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值