编程code之C++敲题遇到的问题

1、include<bits/stdc++.h>

这个头文件包含以下等等C++中包含的所有头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# include <iostream>
# include <cstdio>
# include <fstream>
# include <algorithm>
# include <cmath>
# include <deque>
# include <vector>
# include <queue>
# include <string>
# include <cstring>
# include <map>
# include <stack>
# include <set>
//等等……
2、C++中指针

必须实例化new() ,且用->访问元素,对象用.访问元素

3、C++中数组

C求数组长度

1.使用sizeof(array) / sizeof(array[0]),

在C语言中习惯上在使用时都把它定义成一个宏,比如#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));} 。

2.char array[n];则可以使用strlen(array)获取数组的长度;

3.对于一个一维动态数组,可以使用.size()函数来获取数组的个数。

4.指针指向的数组,不好求,可以尝试

数组整体赋值
char buffer[4];
memset(buffer,0,sizeof(char)4)

int
q=new int [n];
memset(q,0,n*sizeof(int));
错误

数组输入输出问题

输入时可能遇到了一种情况,一直输入,然后回车时,结束输入,运行后面的代码,直接上代码了,逻辑相当简单。

1
2
if(getchar()=='\n') //遇回车结束
break;

#####

C++求绝对值
1
2
3
4
5
include   <stdlib.h>
int abs(int   i) 返回整型参数i的绝对值     
double cabs(struct   complex   znum) 返回复数znum的绝对值     
double fabs(double   x) 返回双精度参数x的绝对值     
long labs(long   n) 返回长整型参数n的绝对值

#####

5、C++中String

首先要使用string数据类型,需要引入头文件 #include,注意不是string.h头文件。

CString、string和string.h这几个区别:

CSting:CString是MFC或者ATL中的实现,是MFC里面封装的一个关于字符串处理的功能很强大的类,只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用标准C++中的string类了。在MFC中使用不需要自己加,但在另外的程序中需要加入#include。

string:string类既是一个标准c++的类库,同时也是STL(Standard Template Library,标准模版库)中的类库,已经纳入C++标准之中。它和CString有本质的区别。

string.h:C语言里面关于字符数组的函数定义的头文件,常用函数有strlen、strcmp、strcpy等等,这个头文件跟C++的string类半点关系也没有,所以 并非 <string.h>的“升级版本”,他们是毫无关系的两个头文件。

综上,cout函数重载的是string类库中的string类型,而不是CString或string.h中的。

3.string类型的读入:

1
2
cin>>s;             //不能读入空格,以空格、制表符、回车符作为结束标志
getline(cin,s); //可以读入空格和制表符,以回车符作为结束标志

4.求string类型的长度:

int len=s.size(); 或者 int len=s.length();

两种方法是等价的

5.求string类型下标为i的字符:

s[i] 或 char c=s.at(i)

6.查找t是否为s的子串:

s.find(t);

如果t是s的子串则返回首次匹配的位置,否则返回 string::npos 或 -1 //重点

7.字符数组转string类型:

1
2
3
4
5
6
7
8
9
1.向构造函数传入c字符串创建string对象:
string str(ch);

2.使用拷贝构造函数创建string对象:
string str = ch;

3.对已有的string对象调用string类内部定义的赋值运算符:
string str;
str = ch;

前两种是运用构造函数直接创建一个内容与c字符串一致的string对象;第三种是c++标准库编写的string类的内部重载了赋值运算符,使之能够以c字符串作为右操作数对string对象进行赋值,使string对象的内容与c字符串一致。

8.string类型转字符数组:

1
strcpy(str,s.c_str());

需要引用string.h头文件,str为char数组,s为string类型

9.将C++的string,转换成char* 的字符串

我们经常会使用C和C++的混合编程,在某些情况下,需要将C++的string,转换成char* 的字符串。下面说两种可行的方法,作为总结。

1.data();

1
2
string str="abc";
char *p=(char*)str.data();

2.c_str();

1
2
3
string str="adcd";

char *p=(char*)str.c_str();

9.两个string比较大小:

if(s1<s2); 或 s1.compare(s2);

相等时返回0;s1>s2时返回1,s1<s2时返回-1

10.两个string连接:

s1=s1+s2; 或 s1.append(s2);

11.对string类型数组排序

1
2
3
4
5
6
7
8
string s[100];

sort(s,s+n,cmp);

int cmp(string a,string b)
{
return a<b; //或a>b;
}

其中sort函数为C++ STL中提供的快速排序函数。

12.C++ 中有大量的函数用来操作以 null 结尾的字符串

序号函数功能
1strcpy(s1,s2)复制字符串 s2 到字符串 s1
2strcat(s1,s2)连接字符串 s2 到字符串 s1 的末尾
3strlen(s1)返回字符串 s1 的长度
4strcmp(s1,s2)返回s1与s2的比较结果
5strchr(s1,ch)返回一个指针,指向字符串s1中字符ch的第一次出现的位置
6strstr(s1,s2)返回一个指针,指向字符串s1中s2的第一次出现的位置

13.C++ 标准库提供了 string 类

支持上述所有的操作,另外还增加了其他更多的功能

  • append() – 在字符串的末尾添加字符
  • find() – 在字符串中查找字符串
  • insert() – 插入字符
  • length() – 返回字符串的长度
  • replace() – 替换字符串
  • substr() – 返回某个子字符串
14.刷题中遇到的一些技巧

输入:

scanf和cin都是读到空白结束,尽量使用scanf和gets代替cin。

while (scanf(“%d%d”,&a,&b)!=EOF) 代替 while (cin>>a>>b)

输出:

注意大小写,换行,尽量用printf代替cout。

printf(“%d\n”, a + b) 代替 cout<<a + b<<endl;

用getline读取整行文本

​ string line:

​ while(getline(cin,line))

​ cout<<line<<endl;

最后一个空格问题
​ if(i!=n-1)//最后一个元素不再输出空格

​ {

​ putchar(‘ ‘);

​ }

EOF问题

//C语法格式:

​ while(scanf(“%d%d”,&a,&b) != EOF)

​ { …. }

//C++语法格式:

while( cin>> a >> b )

{ …. }

输入是一整行的字符串,本类的输入方式如下:

C语法:

char buf[20];
gets(buf);

C++语法:

char buf[ 255 ];
cin.getline( buf, 255 );

有时候int型不够用,可以用long long或int64型(两个下划线)。Int到2亿多

值类型表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之间的整数。

printf(“%I64d”,a); //__int64 一般VC编译器使用

printf(“%lld”,a); //long long 一般g++编译器使用

避免每次输入用例

freopen(“fin.txt”,”r”,stdin);

遇回车结束

if(getchar()==’\n’) //遇回车结束
​ break;

素数表生成

prime[j*i]={1};//不行

for(int i=2;i*i<500000;i++)

​ {

​ for(int j=2;j*i<500000;j++)

​ {

​ prime[j*i]=0;

​ }

​ }

绝对值与取整

int abs(int i) 返回整型参数i的绝对值
double fabs(double x) 返回双精度参数x的绝对值

使用floor函数。floor(x)返回的是小于或等于x的最大整数。
如: floor(10.5) == 10 floor(-10.5) == -11
使用ceil函数。ceil(x)返回的是大于x的最小整数。
如: ceil(10.5) == 11 ceil(-10.5) ==-10

子串查找

s.find(t);//如果t是s的子串则返回首次匹配的位置,否则返回 string::npos 或 -1 //重点

数组整体赋值
char buffer[4];
memset(buffer,0,sizeof(char)4)

Find函数

vector::iterator result = find( L.begin( ), L.end( ), 3 ); //查找3
​ if ( result == L.end( ) ) //没找到

表示坐标

typedef pair<int,int> P;

//P(sx, sy)

//p.first == gx && p.second == gy

INT_MAX,INT_MIN 这就是最大值和最小值


博客
32132
07-14 362
07-12 294
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值