C++ 编程题常用总结

一、数学问题

(一)整型最大值

INT_MAX、INT_MIN、LLONG_MAX在头文件里面

int最大值为2147483647,共10位数字;

LLONG_MAX最大值有19位数字,以9开头

(二)四舍五入

cmath的round函数
或(int)(a+0.5)

(三)pow

在这里插入图片描述
返回值为浮点类型 直接输出返回值会自动四舍五入
注!!! :(int)pow(5,2)=24
赋值给整型变量会取整,所以使用浮点型返回值前 须先用round函数对结果四舍五入
在这里插入图片描述

二、类型问题

(一)字符串与数值转换

string转int、long、long long、float、double、long double:
头文件< string>:stoi、stol、stoll、stof、stod、stold

char c[10]转int、long、long long:
头文件< cstdlib>:atoi、atol、atoll

int、long、long long、float、double、long double转string:
头文件< string>:to_string
http://www.cplusplus.com/reference/string/stoi/

(二)字符判断与大小写转换

cctype 里面:
isalnum 是字母数字;isalpha 是字母;isdigit 是数字;isupper 是大写字母;islower 是小写字母;isblank 是空格/tab键;isspace 是空格/tab键/回车;
tolower(c)将c转换为小写; toupper(c)将c转换为大写

algorithm:
string 大小写转换
transform(str.begin(),str.end(),str.begin(),::toupper);
transform(str.begin(),str.end(),str.begin(),::tolower);

string str="how are you";
transform(str.begin(),str.end(),str.begin(),::toupper);
cout<<str;	//HOW ARE YOU

三、string

字符串+=字符+字符串 (可行)

(一)常用方法

查找(find):返回值为size_t类型的下标值,即0,1,2,3···
s.find(ss)!=s.npos //即找到
利用构造函数的逆置和截取

string s2(s1.rbegin(),s1.rend()); //反向迭代器
string(s.begin()+4,s.begin()+10); //第5到第10个字符(包括begin()+4,不包括begin()+10)

截取子串(substr)
s.substr(pos,n) 截取s中从pos开始(包括0)的n个字符的子串,并返回,若不足n个,则截取到末尾 n可以为0,得到空串
s.substr(pos) 截取s中从pos开始(包括0)到末尾的所有字符的子串,并返回

删除(erase):

sequence (1)string& erase (size_t pos = 0, size_t len = npos);
character (2)iterator erase (const_iterator p);
range (3)iterator erase (const_iterator first, const_iterator last);

s.erase(0, 5); // 下标0开始,删除5个字符
s.erase(2); // 删除下标2开始的所有字符
移除字符串s的第一个字符:s.erase(s.begin());

插入(insert):

string (1)string& insert (size_t pos, const string& str);
string (2)string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
c-string (3)string& insert (size_t pos, const char*s);
buffer (4)string& insert (size_t pos, const char*s, size_t n);
fill(5)string& insert (size_t pos, size_t n, char c);
iterator insert (const_iterator p, size_t n, char c);
single character(6)iterator insert (const_iterator p, char c);
range (7)template < class InputIterator>
iterator insert (iterator p, InputIterator first, InputIterator last);
initializer list (8)string& insert (const_iterator p,initializer_list< char> il);

在某下标位置插入字符串/字符串子串/c字符串/c字符串前n个字符/n个字符c
在某迭代器插入n个字符c/字符c/给定范围内字符…
在字符串s前面增加n个0: s.insert(0,n,’0’);
s.insert(0, “3”) //第一个参数为0~s.length()包括len
在这里插入图片描述

(二)输入输出

1.sscanf()、sprintf()

int sscanf (const char * s, const char * format, …);
//首参数为c类型字符串,末参数(接收结果)为pointer to allocated storage…with the appropriate type(可为string)
sscanf()从一个字符串中读进与指定格式相符的数据读取成功返回1 失败返回0
sscanf(a,“%lf”, &temp); //char c[10];double temp
sscanf(s,“%d”,&d); //char s[10]; int d
sscanf(“123456”, “%4s”, str);

int sprintf (char* str, const char * format, … ); //首参数为c类型字符串
sprintf() 把格式化的数据输出到某个字符串中 返回输出的字符串长度
sprintf(b,“%.2lf”,temp); //char b[10]; double temp
sprintf(s,“%s%d%c”,“test”,1,‘2’); //char s[10];

2.c类型字符串与string的输出

string s ="abc";
char * c;
c = s.c_str(); // 报错   error: invalid conversion from 'const char* ' to 'char*'
//可改为 
const char *c = s.c_str();//c_str()返回的是一个临时指针,在s消失以后,指针会变成野指针。并且不能通过指针来改变数组的值. 因为是指向常量的指针

//或可使用
char *c=new char[100];
//使用strcpy时,c必须有足够的空间来容纳s的字符串
//且c的大小要比string长度大1,因为要多存'\0'
strcpy(c,s.c_str()); //c_str() 在< string >里面

getline(cin,s);以换行符结束
在使用前需用cin.ignore()或getchar();处理上一次输入后留下的换行符。
连续两个getline之间无需 cin.ignore()/getchar()
在这里插入图片描述
printf与cout
string a;
在这里插入图片描述
scanf(“%s”,a);
只能通过printf(“%s\n”,a);输出
cout<<a; 输出为空
p
rintf(“%s\n”,a .c_str()); 出错
cout<<a.c_str();出错
在这里插入图片描述
cin>>a;
printf(“%s\n”,a);输出未知

其余以下正常:
cout<<a; 正常
printf(“%s\n”,a .c_str());
cout<<a.c_str();
在这里插入图片描述
scanf(“%s”,&a[0]);
printf(“%s\n”,a);输出未知
cout<<a; 输出为空
printf(“%s\n”,a .c_str()); 正确
cout<<a.c_str(); 正确

四、algorithm

(一)sort

降序排序 sort(a,a+n,greater());
在这里插入图片描述

(二)reverse

在这里插入图片描述
reverse函数无返回值 return none

(三)find

find

(四)min_element、max_element

返回值为指向最小值/最大值的指针
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(五)distance(在< iterator >中)

return :The number of elements between first and last.

三、STL

(一)vector

vectora(5,1); //五个值为1的元素
vectorb(5); //五个元素 默认初始值都为 0
在这里插入图片描述
b.push_back(10); //向b末尾添加第6个值为10的元素
a.pop_back(); // Delete last element

insert(return an iterator pointing to the first of the newly inserted elements.)在这里插入图片描述在这里插入图片描述
erase
在这里插入图片描述
a.erase(a.begin()+2); //删除第3个元素

(二)queue

在这里插入图片描述

(三)stack

push();
pop();
top();

(四)priority_queue

//降序队列(默认), 大顶堆 须有“<运算符” 值小的优先级低
大顶堆进行堆排序时 是取堆顶的最大值,交换到新末尾(n-1、n-2…3、2、1), 堆顶的弹出过程,即出队过程,是降序, 而在原空间上实际形成了升序序列 这与“<”是相符的
priority_queue<int,vector< int>,less< int> >q;

//升序队列,须有“>”运算符
priority_queue<int,vector< int >,greater< int> > q;

q.push();
q.top();
q.pop();

(五)set

s.insert(a.begin(),a.end()); //a为另一容器,如vector、set
s.insert(x)

return a pair, with its member pair::first
set to an iterator pointing to either the newly inserted element or to the equivalent element already in the set. The pair::second element in the pair
is set to true if a new element was inserted or false if an equivalent element already existed.

s.erase(x)
s.find(x)!=s.end() //即找到

multiset<int,greater>small; //从大到小
multiset< int >big; //默认从小到大

(六)map

1、在map中,由key查找value时,首先要判断map中是否包含key。
2、如果不检查,直接返回map[key],可能会出现意想不到的行为。如果map包含key,没有问题,如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,返回value。也就是说,map[key]不可能返回null。
3、map提供了两种方式,查看是否包含key,m.count(key),m.find(key)。
4、m.count(key):由于map不包含重复的key,因此m.count(key)取值为0,或者1,表示是否包含。
5、m.find(key):返回迭代器(指向pair类型),未找到则返回m.end() 。

map<int,float,greater<int>>m;
auto ret=m.insert({a,b});
if(!ret.second)
	ret.first->second+=b;

四、其他

(一)并查集

int findp(int a)
{
    if(p[a]!=a)
    {
        p[a]=findp(p[a]);//减少层次,直接指向根值
    }
    return p[a];
}
void join(int x,int y)  //合并,指向同一个根值
{
    x=findp(x);
    y=findp(y);
    if(x!=y)
        p[x]=y;
}

(二)结构体 运算符重载

bool operator<=(const point &b) const
{
	return this->elem<=b.elem;
}

(三)其它

scanf(“%c%c”,&l,&r); //会接收回车

t=new btnode(); //最好加括号
保留空括号,表示用0对该对象进行初始化

注意处理成绩相同的情况,如1 1 3 4, 因为有两个人并列第一,所以第二名实际是排在第三的位置。

统计并列最大
使用vector记录,设置一个最大值,遍历数据,与之比较,大则更新最大值,并清空vector,添加最大值,相等则同为最大,直接加入vector。由此保证vector中始终为最大数据,且可以并列存在多个数据,而无需排序后再取前面等最大的值

if(tback<0)
need-=tback,tabck=0; //逗号表达式,一行两句

范围for语句:如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型

c++ 运算符优先级(部分) 逻辑非>左移右移>比较>位(&^|)>逻辑与或

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值