C++与STL

  从C到C++, 这篇博客不糊弄了,认认真真写吧!很多内容来自刘汝佳的《算法竞赛入门经典》,这本紫书真的好用,感谢作者刘汝佳。

  首先,需要弄清楚C与C++之间的区别,C语言相对于C++来说是更加基本的,用C写代码会比C++多写一些,自然调试的难度也会增加,C++相比于C有着更加强大的功能,当然如果我们不能够

灵活透彻的掌握C++的特性时候在必要情况下只能用基本的代码来写了,感觉用C++不是一件容易的事情,很多新的功能必须要更加了解才行。

  C++与C在语法上是不同的,大部分头文件C++的是以'c'大头,而C是以'.h'结尾的,但是C++仍然支持用C的头文件来写,另外它们的输入输出有了明显的区别,cin、cout与scanf、printf相比较简洁了很多,但就是因为这种简洁(不需要声明数据类型)所以导致了速度变慢,用ios::sync_with_stdio(false)可以有效加速流,C++比C多了bool使得判断更加清晰。

  C++的引用也是要说明的, 下面是代码:

#include <iostream> 
using namespace std; 

void swap2(int& a1, int& b1) {
    int t = a1; a1 = b1; b1 = t;     
}

int main() {
    int a = 3, b = 4; 
    swap2(a, b); 
    cout << a << "\n" << b;
    return 0;    
}

用'&'符号来引用,其中引用与指针是十分相似的,具体的区别我也不太能够说明,但是引用是两个参数共同用一个地址,所以一个参数改变,另一个参数所对应的值也是会改变的,用引用有什么

好处呢?引用可以节省空间时间的浪费,因为引用也是用地址嘛,在某种条件下引用传递的数据小,自然速度也快(地址4字节),但不是任何条件下都要使用引用的。

  下面就说一说结构体吧,结构体很重要,它不仅能够包含变量(成员变量)还可以包含函数(成员函数)当成员函数的名称与结构体名称相同时,我们就叫它构造函数,对于构造函数我的认识仍然不够啊!不过我知道,构造函数能够在声明结构体类型时让改变成员变量的大小,举个例子:

struct Point { 
    int x, y; 
    Point(int x=0; int y=0) : x(x), y(y) {}
};

结构体Point里面的函数就叫结构函数,其中的x(x)与y(y)就是this->x = x this->y = y还可以写成(*this.x = x)(前面的x, y时成员变量,不是结构函数里面的东西),这就达到了修改成员函数的目的了。

  说完结构体,我们说一说模板吧!首先我们给出两个代码:

int sum(int* begin, int* end) {
    int ans = 0; 
    for(int *a = begin; a != end; a++)
         ans += *a; 
    return ans;
}
template<typename T>
T sum(T* begin, T* end) { T ans = 0; for(T *a = begin; a != end; a++) ans = ans + *a; return ans; }

int main() {
  double a[] = { ...
  cout << sum(a, ...
  Point b[] = { ...
  cout << sum(b, ...
}

其中后面的就支持任意类型的,这就是模板的强大,注意我们在第二个代码时候为什么没有用“+=”二十用了“ans = ans + *a" ? 这是由于我们没有定义Point的‘+=‘运算符,Point的’+‘运算符我没有写,

在写程序时候应该加上。 算了,我还是写一下吧!

template<typename T> 
Point<T> operator + (const Point<T>& A, const Point<T>& b) {
    return Point<T>(A.x+B.x, A.y+B.y); 
}    

但是写程序时候还是要调整与修改的,这无关,我们继续往下说。既然模板这么强大,那么sort排序是不是运用到模板了吗,的确,sort支持很多类型,不过在写的时候还是要定义一下'<'运算符。

  说到sort,sort就是STL,那么STL是什么呢?Standard Template Library 标准模板库,这个模板库里有很多东西,我们仅仅说一下几个重要的:set、map、vector、stack、queue、优先队列

set是集合的意思,它具有“互异性”; map就是从键到值的映射,所以也叫关联数组;与于这两个我们能够提供的操作有.count()、.insert()、.find()、.remove()等等。vector是比较灵活的不定长的”数组“,它可以支持的操作有.size()、.resize()、.push_back()、.pop_back()、.clear()等等,剩下的stack支持.top()、.pop()、.push(),queue支持push pop empty等等,优先队列要将front改为top......

   这些就是C++与STL初级的部分了,剩下的东西明天在说(测试STL、大整数类)。。。

  

  如有问题请联系我,转载请标明出处。

猜你喜欢

转载自www.cnblogs.com/yifeiWa/p/10353159.html