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

运行截图,简化了一下,没有N个问题

  1. sort对任意的进行排序,默认升序,若要修改方式,则要修改
    运算符的默认形式
  2. lower_bound查找大于或等于X的第一个位置

不定长数组 vector

  1. vector就是不定长数组,基本操作有a.size(),a.resize(),a.push_back()向尾部
    添加元素,a.pop_back()从尾部弹出元素
  2. vcetor是一个模板类,所以在声明的时候需使用vectora,vectorb,来
    声明所定义的vector数组的类型,vectora类似于int a[],vector不仅可以直接
    赋值还可以作为函数的参数和返回值,且无须像数组一样定义元素个数
    1. 例题 木块问题
    2. 从左到右有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. 再对左右区间重复第二步,直到各区间只有一个数

原创粉丝点击