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];
    }
    
  • 改进后创建变量时structtypedef就可以不用写了

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值