C转CPP
C转Cpp基本篇
1.using namespace std;
#include<iostream>
using namespace std;//用于加载cin cout endl等语法内容
cin >> n;//等效 scanf("%d",&n);
cout << n; // 等效 printf("%d",n);
endl; // 等效 \n 换行
2.cin cout头文件
- 运算速度不如scanf printf
- 全部的头文件都可以改成
c+头文件名,去掉.h
例如cmath cstring
3.变量声明
-
for循环中可以直接定义
for(int i = 0;i<n;i++) cout << n << " " ;//此处" "的作用是空一格
4.bool变量
-
非0为true,0为false
bool flag = ture; bool flag2 = -1; bool flag3 = 0; cout << flag << " " << flag2 << " " << flag3 << endl;
6.const定义常量
-
const
表示常数常量,与C中define
效果相同 -
const int Max = 100; //则MAX定位100
7.string类型
定义 拼接 输入输出 处理
-
string s1 = "Hello"; string s2 = "World"; /*拼接*/string s3 = s1 + s2; /*输入*/cin >> s; //仅能输入一个单词 /*整行输入*/getline (cin,s); /*输出*/cout << s3 << endl;
-
直接输出字符串长度
cout << s.length() << endl; //可以直接输出字符串S的长度
-
取字符(拷贝子串)
s1 = s.substr(n,m)//sub代表子串 str s1 = s.substr(n) //两种方式copy主串字符到子串中 //第一种方式是 将第n个字符后边m个字符拷贝出来(不包括第N个字符) //第二种方式是 将第n个字符后边全部的字符都拷贝到子串中去
8.结构体
-
原本C语言进行结构体书写时需要如下
-
typedef struct Excel { string name; int age; }; int main() { struct shu a[100]; }
-
改进后创建变量时
struct
和typedef
就可以不用写了
9.引用&
-
在C中你需要定义指针类型变量,然后在函数中传值上去
-
Cpp中在函数定义的变量前+&符,便可以直接调用主函数中变量的地址
-
void G(int &a) { a += 1; } int main() { int a = 4; G(a); cout << a << endl; }
C转Cpp Stl篇
10.动态数组 vector
-
头文件
#include<vector>
-
创建数组
vector <int> v(10,2);//给V分配了10个空间,每个空间初始化为2 vector <int> v(10); vector <int> v; //元素值默认为0
-
分配数组大小
v.resize(lenght)
-
末尾添加新的数据
v.push_back(data)
-
迭代器
for(auto p = c.begin();p != c.end();p++) //此时数组定义为C { cout << *p <<<" "; } //自动的把容器里的数据都遍历一遍 //此时需要c++11
//博客写到此处 1-19-18.01
11.set 集和
-
set使用的时候必须包含头文件
-
且set会自动排序
#include <set>; set <int> s; //S后边不可加东西
-
创建方式与创建动态数组十分相似
-
其中查找find(data)返回的是指针地址
/*插入*/s.insert(1); //这样就设置好了一个元素。
/*遍历-利用迭代器*/
for(auto p = s.begin() ; p != s.end ; p++)
{
cout << *p <<" ";
}
/*查找*/s.find(data);
/*其中data是具体数值,并不像是数组的下标,就是具体的元素值
==且其s.find(data)返回的是该值对应的指针地址==*/
/*例子*/ cout << (s.find(2) != s.end()) << endl;
//这是一个bool值对比,等式成立则为1,不成立则为0. 切记end是最后一个元素下一个位置,所以没找到也是0
//并且这也是个迭代器,从头比对到尾,直到找到为止
/*删除*/s.erase(data);
13.map键值对
-
map是一个键值对,他会将所有键值对按照从小到大排序(若是字符则会按照ASCII码进行排序)
-
排序内容是根据括号内(第一个元素)来排序,后边的元素是对应的标号、符号
-
键值对例如一个东西对应另一个东西,像是人名与学号
-
头文件
#include <map>
-
创建键值对、处理(添加、访问、遍历、获取长度)
-
访问:若存在,则返回其对应的值,若不存在则返回0
-
遍历:仍然还是迭代器,其指针获取值的时候类似结构体指针
/*创建*/map <string,int> m; /*添加*/m["hello"] = 2; m["world"] = 3; /*访问*/cout << "hello : " << m["hello"] << endl; //这样就会输出 hello : 2 /*遍历(迭代器)*/ for(auto p = m.begin() ; p != m.end() ; p++) { cout << p->first << " : " << p->second << endl } /*获取长度*/ m.size(); cout << "m的长度为 :" <<m.size() << endl;
14.stack 栈
-
头文件
#include <stack>
-
创建栈,处理(压栈,出栈,访问栈顶,获取长度)
-
其无法使用迭代器,只能访问栈顶元素
/*创建栈*/stack <int> s; /*压栈*/s.push(data); /*出栈*/s.pop(); /*访问栈顶*/s.top(); /*获取长度*/s.size();
15.queue 队列
-
先进先出 后进后出
-
头文件
#include <queue>
-
创建队列、处理(入队、出队、访问、获取长度)
/*创建队列*/ queue <int> q; /*入队*/ q.push(data); /*出队*/ q.pop(); /*访问队头*/ q.front(); /*访问队尾*/ q.back(); /*获取长度*/ q.size();
15 16.unordered_map \ unordered_set
-
这两不会进行排序,省去了排序的过程。如果刷题超时了,可以考虑使用这两个
-
头文件
#include <unordered_map> #include <unordered_set>
-
定义方式都是一样,前面改用加上unordered就好了
C转Cpp 进阶篇
17.bitset位运算
-
头文件
#include <bitset>
-
bitset 类似一个字符数组,但他是从二进制的低位到高位依次为b[0],b[1],b[2]···,按照原本b[i]的输出方法正好相反
-
初始化
/*5 表示五个二进制位,初始化为0 , 若变量后边加了数字,则代表初始的10进制数大小*/ bitset <5> b(number); /*若number的位置输入的是2进制,则按照位数输出出来*/ bitset <8> b <100101>;(== 00100101)
-
处理(输出、判断、归零、取反 ···)
/*直接输出一整个整体*/ cout << b << endl //看做一个字符数组,直接整体输出 /*按照下标顺序输出*/ eg:bitset <4> b <1011>; for(int i = 0 ; i<b.size ; i++) { cout << b[i] << " "; } //则结果为 1 1 0 1 ,反着输出出来 /*从字符串s.pos位开始n位长度取出放到 b 中*/ bitset <5> b(s.pos,n); /*是否存在1,判断数组中是否有1*/ b.any(); /*判断是否无1*/ b.none(); /*判断有几个1*/ b.count(); /*判断b中元素个数(字符长度)*/ b.size(); /*下标为i的元素是否为1*/ b.test(i); /*所有位取反*/ b.flip(); /*第i位取反*/ b.flip(i); //注意i是从低王高数 /*所有位归零*/ b.reset(); /*仅第i位归零*/ b.reset(i); /*类型转换——转化成10进制整数*/ unsigned long a = b.to_ulong(); //转化成unsigned long类型
18.sort 排序
-
头文件
#include <algorithm>
-
主要功能是对一个数组
(int arr[] / vector)
进行排序,vector是容器,需要用v.begin()
表示开头,v.end
表示尾 -
若是
int arr[]
,使用arr
表示数组的首地址,arr + n
表示尾部/*先定义数组*/ vector <int> m(10); for(int i =10 ;i>0;i--) m[i-1] = 10-i; /*排序*/ sort(m.begin(),m.end(),cmp); //end是最后一个元素的下一个 // 为给定cmp自定义的话。默认从小往大排序 //cmp自定义一个函数,例如是一个bool函数,如果返回值为真,则x放在y前面;若返回值为假,则交换两数。 //默认x 在 y的前面 只能用>或者<号,不能有等号 bool cmp (int x,int y) { return x > y; } /*后缀添加*/ m.push_back(number); //在尾部添加一个数字
20.cctype 头文件的函数
-
对字符进行操作的头文件
-
常用函数
isalpha(); //判断是否是字母 islower(); //判断是否小写字母 isupper(); //判断是否大写字母 isalnum(); //判断字母或者数字 isspace(); //判断是否为空格(space) \t \r \n这样的字符 tolower(); //字母转化为小写字母 toupper(); //转化为大写字母
-
前五个返回值是
bool
类型的,后两个是对字符直接进行转换
21.C++11 解释
-
auto to+string() stoi stof unordered_map unordered_set
22.auto声明
-
作用:可以让编译器根据初始值直接推断新变量类型
/*eg:*/auto x = 100; auto y = 1.8;
-
使用的时候一定要初始化,否则编译器不知道它是什么类型的变量
-
推广:迭代器
- 数组、集和、键值对 可以用迭代器来访问
23.for循环
-
传值 传址 推广
int a[5] = {1}; //1 0 0 0 0 /*传值:此时就是利用i遍历数组a,每次输出数组中每个元素的值,i只是一个容器,并不能改变数组中元素的值*/ for(int i:a) { cout << i << " "; } /*传址 : 加入&之后,若改变i的值,数组中的值也会被改变*/ for(int &i:a) { i++; cout << i << " "; } /*所有的容器都可以通过这样的方式循环 例如*/ vector <int> a(10,1); for(auto i:a) cout << i << " "; cout << endl;
24.to_string 将数字转化为字符变量
-
作用:将数字转化为字符变量
-
头文件:
#include <string>
-
使用方法
string s = to_string(123.1); printf("%s",s.c_str());
25.stoi_stod 将字符串转化为其他变量
-
作用:将字符串转化为其他变量
-
处理
/*转化为 int 型*/int a = stoi("123"); /*转化为 double 型*/double a = stod("123.6");
-
补充
stof stold stol stoll stoul stoull
最小公倍数
cout << (i*j)/__gcd(i,j);
最大公约数
cout << __gcd(x,y);
大小根堆
优先队列
然后蒟蒻在标签的提示下想到了优先队列
C++党有个福利:
我们有** STL ** !!!
STL里的优先队列 : priority_queue
定义:
priority_queue<int>q;
从小到大:
priority_queue<int,vector<int>,greater<int> >q;
如果你想从大到小的话可以重载运算符:
struct Node{
int x,y;
Node(int a=0, int b=0):
x(a), y(b) {}
};
struct cmp{
bool operator()(Node a, Node b){
if(a.x == b.x) return a.y>b.y;
return a.x>b.x;
}
};
priority_queue<Node,vector<Node>,cmp>q;
或者你也可以用less
priority_queue<int,vector<int>,less<int> >q;
最后这就是道水题了:
题目描述
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 �−1n−1 次合并之后, 就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 11 ,并且已知果子的种类 数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有 33 种果子,数目依次为 11 , 22 , 99 。可以先将 11 、 22 堆合并,新堆数目为 33 ,耗费体力为 33 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 1212 ,耗费体力为 1212 。所以多多总共耗费体力 =3+12=15=3+12=15 。可以证明 1515 为最小的体力耗费值。
输入格式
共两行。
第一行是一个整数 �(1≤�≤10000)n(1≤n≤10000) ,表示果子的种类数。
第二行包含 �n 个整数,用空格分隔,第 �i 个整数 ��(1≤��≤20000)a**i(1≤a**i≤20000) 是第 �i 种果子的数目。
输出格式
一个整数,也就是最小的体力耗费值。输入数据保证这个值小于 231231 。
输入输出样例
输入 #1复制
3
1 2 9
输出 #1复制
15
说明/提示
对于 30%30% 的数据,保证有 �≤1000n≤1000:
对于 50%50% 的数据,保证有 �≤5000n≤5000;
对于全部的数据,保证有 �≤10000n≤10000。
#include<bits/stdc++.h>
using namespace std;
int n,x,ans;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>x,q.push(x);
while(q.size()>=2){
int a=q.top(); q.pop();
int b=q.top(); q.pop();
ans+=a+b;
q.push(a+b);
}
cout<<ans<<endl;
return 0;
}
全排列
next_permutation(arr,arr+n);