C++编程实践
来源:互联网 发布:手机淘宝评价删除不了 编辑:程序博客网 时间:2024/06/06 00:24
命名空间
为了解决函数不能重名的问题,就好比有两本一模一样的书,为了区分书是谁的在上面分别写上了不同的名字,而这个名字就是命名空间。
而c++中的输入是用流的方式实现的
键盘—>”hello”—>cin(输入流)—> >>(提取)—>变量—> <<(插入) —> cout(输出流)—>屏幕
while(cin >> a >>b )的意思是当a,b流都读完时,退出while循环,这样可以避免在C语言中scanf中必须要使用的%d,%c等占位符,当同时它也是有缺点的就是流式输入的算法效率极低,在大量输入时,并不推荐使用流式输入
#include<iostream>#include<algorithm>using namespace std;const int maxn = 100+10;int A[maxn];int main(){ long long a,b; while(cin >> a >> b) { cout << min(a,b) << "\n"; } return 0;}
引用
在C++中,如果在参数前加上&,则表示这个参数按引用传递,在使用时输入相应的变量名即可
#include
using namespace std;
void swap2(int& a, int& b) {
int t = a; a = b; b = t;
}
int main() {
int a = 3, b = 4;
swap2(a, b);
cout << a << ” ” << b << “\n”;
return 0;
}
字符串
C++特有类型string,但字符数组仍然有效,但不同点是string类型支持cin/cout的流式输出。而字符数组却不支持,string类型还可以直接相加
The First C++ Program
#include <iostream>using namespace std;int main(){ int number; cin>>number; cout << "My favorite name is "<<"源稚生呀" << endl; cout<<"my age is "<<number<<endl; return 0;}
运行截图:
再谈结构体
#include <iostream>using namespace std;struct Point { int x,y; Point(int x=0, int y=0) { this->x =x; this->y =y; } //:x(x),y(y){};为简式写法};Point operator + (const Point& A,const Point& B){ return Point(A.x+B.x,A.y+B.y);}ostream& operator << (ostream &out, const Point& p) {out << "(" << p.x << "," << p.y << ")";return out;}int main(){ Point a,b(2,3); a.y = 4; cout<<a+b<<endl; return 0;}
1. 结构体中定义的函数没有返回值,这样的函数被称为构造函数
2. this为指向当前对象的指针,this->x为当前的对象X
3. 程序实现的是结构体的加法,在程序后面重新定义了加法
STL初步(标准模板库)
排序与检索
现有N个大理石,每个大理石上写了一个非负整数。首先把各数从小到大排序,然后回
答Q个问题。每个问题问是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石上
写着x。排序后的大理石从左到右编号为1~N。(在样例中,为了节约篇幅,所有大理石上
的数合并到一行,所有问题也合并到一行。
#include <iostream>using namespace std;struct Point { int x,y; Point(int x=0, int y=0) { this->x =x; this->y =y; } //:x(x),y(y){};为简式写法};Point operator + (const Point& A,const Point& B){ return Point(A.x+B.x,A.y+B.y);}ostream& operator << (ostream &out, const Point& p) {out << "(" << p.x << "," << p.y << ")";return out;}int main(){ Point a,b(2,3); a.y = 4; cout<<a+b<<endl; return 0;}
- sort对任意的进行排序,默认升序,若要修改方式,则要修改
运算符的默认形式 - lower_bound查找大于或等于X的第一个位置
不定长数组 vector
- vector就是不定长数组,基本操作有a.size(),a.resize(),a.push_back()向尾部
添加元素,a.pop_back()从尾部弹出元素 - vcetor是一个模板类,所以在声明的时候需使用vectora,vectorb,来
声明所定义的vector数组的类型,vectora类似于int a[],vector不仅可以直接
赋值还可以作为函数的参数和返回值,且无须像数组一样定义元素个数- 例题 木块问题
- 从左到右有n个木块,编号为0~n-1,要求模拟以下4种操作(下面的a和b都是木 块编
号)。
move a onto b:把a和b上方的木块全部归位,然后把a摞在b上面。
move a over b:把a上方的木块全部归位,然后把a放在b所在木块堆的顶部。
pile a onto b:把b上方的木块全部归位,然后把a及上面的木块整体摞在b上面。
pile a over b:把a及上面的木块整体摞在b所在木块堆的顶部。
遇到quit时终止一组数据。a和b在同一堆的指令是非法指令,应当忽略。
样例输入:
1234
样例输出:
1234-> 3087-> 8352-> 6174-> 6174(说实话,我不是很懂题目的意思)
#include <iostream>#include <cstdio>#include <vector>#include <string>using namespace std;const int maxn = 30;int n;vector<int >pile[maxn];//pile堆void find_block(int a ,int &p,int &h){ for(p=0;p<n;p++) { for(h=0;h<pile[p].size();h++) if(pile[p][h] == a ) return; }}//找到木块a所在的堆和高度void clear_above(int p,int h){ for(int i = h+1;i<pile[p].size();i++) { int b = pile[p][i]; pile[b].push_back(b);//因为它的编号就是它的位置 } pile[p].resize(h+1);}//将第p的h高度以上的木块放回原位void pile_onto(int p, int h,int p2){ for(int i = h+1;i<pile[p].size();i++) { int b= pile[p][i]; pile[p2].push_back(b); pile[p].resize(h+1); }}//把第p堆高度为h及其上方的木块整体移动到p2 堆的顶部void print(){for(int i = 0;i<n;i++){ printf("%d:",i); for(int j = 0;j< pile[i].size();j++) { printf(" %d\n",pile[i][j]); }}}int main(){ /*int a,b; cin>>n; string s1,s2;*/ cin>>n; for(int i = 0;i<n;i++) { pile[i].push_back(i); } pile_onto(1,-1,2); print(); return 0;}
勉强弄出来了一个将木块1移动到了木块2的上方,但是运行示例是真的有问题,包扩H的取值,原则上是模仿了4种操作,将堆1移动到堆2上方,将堆还原,等等
插入排序
插入排序就好比我们打扑克牌,开始时,我们手上什么也没有,然后从桌上随机抽一张放入手中,对于剩下的扑克,我们拿起时与手上的比较,将它插入到正确的位置,所以在我们手上的扑克总是有序的,为了将它正确的插入,我们总是从左到右将它与手中的牌进行比较,直到最后一张
时间复杂度O(n^2),
代码如下;
#include<stdio.h>#define N 50typedef struct{char name[8];int score;}student;void insersort(student *a,int n){ int i,j,temp; for(j=1;j<n;j++) { temp = a[j].score; i = j-1; while(i>=0&&a[i].score<temp) { a[i+1].score = a[i].score; i--; } a[i+1].score = temp; }}int main(){ student s[N]; int n,i; int num=1; printf("输入学生人数n:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("姓名:"); scanf("%s",&s[i].name); printf("成绩:"); scanf("%d",&s[i].score); } insersort(s,n); printf("直接插入排序为:\n"); for(i=0;i<n;i++) { printf("%4d %s%4d\n",i+1,s[i].name,s[i].score); }}
运行截图
快速排序
快速排序是对冒泡排序的一种改进,采用了分治的策略
基本原理
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
3. 步骤
a. 先从数列中取出一个数作为基准数。
b. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
c. 再对左右区间重复第二步,直到各区间只有一个数
- C 编程最佳实践
- C 编程最佳实践
- C 编程最佳实践
- C 编程最佳实践
- C 编程最佳实践
- C 编程最佳实践
- C编程最佳实践
- C 编程最佳实践
- C 编程最佳实践
- C 编程最佳实践
- C 编程最佳实践
- C 编程最佳实践
- C 编程最佳实践
- C 编程最佳实践指导
- win编程实践(1)【c++】
- win编程实践(2)【c++】
- 五个好的C语言编程实践
- [转]C 编程最佳实践
- Android Studio——Activity的注册即跳转
- 7.2 编写插件-模型插件
- Heavy Transportation
- Android Bug收集解决方案分析
- TaskScheduler
- C++编程实践
- Linux C之命名规则
- WebView 支持 Html5 video 进行全屏播放
- chapter9.2
- jedis-spring报错 jedis版本过高 应改为2.2.2 java.lang.VerifyError: Bad type on operand stack
- POJ-3264 Balanced Lineup (线段树 基本题)
- Swift4
- 那些年我们学过的排序算法
- Java线程泄露的分析与处理