C++笔记2

1、算法
脱离具体的语言
有穷性 — 在保证执行有限步骤之后确定能够结束
确切性 — 每条语句具体干什么
输入输出 — 所有的算法都有输出,打印屏幕,写文件,写DB

2、快速排序法
数据个数超过一个,任选其中一个数据作为分界值,把其他数据按大小关系分为2组,分界值在中间
对两组数据实行递归重组

//快速排序算法,效率最高的排序算法。第一个参数表示数组首地址,第二个参数表示数组起始位置,第三个参数表示结束位置

 void mysort( int * p , int left , int right ){
	        int l = left ;     //从左侧开始走
	        int r = right ;    //从右侧开始走
	        int povit = p[(left + right)/2];  //把数组中间的一个数据作为分界点
	        do{
	             while( p[l]povit && r > left ){
		               		r--;
		           	}
		
	            	if( l <= r ){
	                		int t = p[l];
		                	p[l] = p[r];
		                	p[r] = t ;			
		                	l++;
			                r--;
		            }
	         }while( l <= r );   //条件就是左右的两个人还没有碰面
	         
	         if( r > left ){      //只要右边的仍比左边的大,就要继续循环
		           mysort( p , left , r );	   	
	         }

	         if( l < right ){      //只要左边的仍比右边的大,也要继续循环
		            mysort( p , l , right );
	          }
     }    

3、直接使用系统的qsort()函数
要自己定义一个排序规则

4、模版
(1)模版的参数至少出现一次,才能确定类型
(2)只能在紧跟的函数中使用,函数声明紧跟在后面
声明多个模版类型 template
class关键字不能省略
(3)对于模版类型的要求,要能重载">","<","="
建议:在编码时能用一种运算符完成的操作,就不要使用多个运算符,避免多个重载
(4)用模版写的函数叫函数模版
函数模版在调用的时候确定类型的
用模版写的类叫类模版
数据类型,参数类型,函数返回类型都可以使用模版
类模版不是类,是不完整的类
类模版要在声明时用类名指定,确定类型

(5)C++的泛型(模版)是编译时确定类型的 — 效率
Java的泛型是运行时的

(6)模版类的声明和定义(多文件结构)是不能分开的
模版函数的声明和定义是可以分开的 template 在头文件和实现文件中都要出现

5、STL包含三大类,容器类(可以存储其他对象的对象),算法(一系列封装好的函数),迭代器(用于遍历操作的类)
容器可以直接存储对象,也可以存储对象的指针。成熟的程序员喜欢使用间接存储。
容器主要包括两种类型:序列类(一般是线形存储)和关联类(一般是非线性存储)。

vector  ----   数组  可变长   不提供pop_front()删除头元素的函数
      list      -----  链表
(1)Vector    v[1000]当越界的时候,会出现段错误
		v.at(1000) 越界的时候,会抛出out_of_range的异常,在程序中捕获
		v.size()  返回长度,可利用这个循环迭代
		v.empty()判断容器是否为空
		Iterator迭代器  : 可以做取*操作   *iterator  iter->name  <=> (*iter).name    iter++
		v.begin()  指向数组的开始
		v.end()      指向数组最后一个元素的后面,是一个结束标志
		vector v1;
		vector::iterator it;         //iterator是vector的一个内部类
		for( it = v1.begin(); it != v1.end(); it++ )
		cout << *it << endl;
		v.insert(iter,5);            //在iter所指的元素前面插入5
		v.insert(iter,5,100);    //在iter所指的元素前插入5个100
		这样的插入操作,会造成原来的iterator失效,对起重新赋值,可以保证继续使用
                               
(2)list
		不能做at()
		多了push_front(),pop_front()
		iter不能做加n操作
		使用于做频繁的插入删除操作

6、关联式容器
(1)map
适合根据键查找值的操作
存储上按照键值排序 ,并且key值唯一

	map m;

    Student s( 1 ,"liucy" );
    m.insert( map::value_type( s.getId() , s )  ) ;              //创建一个pair,并存到map的第一个位置中    value_type是map的静态函数

     Student s2( 4, "tangliang" );
     m.insert( map::value_type(s2.getId() , s ) ) ;
     map::iterator it ;
     for(it=m.begin();it!=m.end();it++ ){
     cout<< it->first << " "<second;
     cout<

在map中用[]查询,并不安全
m.find(1); // 查询key为1的value
返回一个iter,指向找到的那个键值对,如果没找到,iter会与iter.end()的值相等
(2)multimap

其中的key允许重复
查找:
multimap::iterator it ;
multimap::iterator lt ;
multimap::iterator ut ;

lt = m.lower_bound( 1 );
ut = m.upper_bound( 1 );

for( it=lt ; it != ut ; it++ ){
        cout<first <<" " ;
        cout<second <

(3)set

 set中不能插入重复数据,相当于map中的key
插入数据的时候不必指定位置
因为与map中的key一致,仍保留着排序的特性

(4) multiset

  与vector类似,唯一不同的就是保留着排序的特性

7、模版的声明和实现都写在头文件中

你可能感兴趣的:(C++个人笔记,c++)