C++:OOP+STL

六眼飞鱼酱① 提交于 2020-02-27 10:55:34

开学第一天!印象笔记用的太不顺手,还是把笔记搬到这里吧~

OOP

面向对象<–>面向过程
IDE:集成开发环境(需熟悉1-2种)
STL:标准模版库
命名空间namespace:
一个标识符的可见范围(命名空间操作符::)
有效解决名字冲突的问题

void assert( int expression );

assert函数:计算expression,若出错则输出错误信息,调用abort终止程序运行

mini.cpp程序分析

// a mini c++ program
#include <iostream>
int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;   // 返回0表示运行成功
}

头文件后缀为.h/.hpp或无后缀(标准头文件)
main函数不写return会默认返回0,代表运行成功

流输出符<<

二元操作符,左结合,返回值std::cout

cout<<"Hello World";
//左操作数cout(类似文件),右操作数字符串,将右输出到左
//返回值 std::cout
cout<<"Hello World"<<endl;
//第一次返回cout,右操作数endl,将右输出到左

string

字符串的连接可以直接用+

string spaces(n,'char');
cout<<spaces;
//连续输出n个char字符
os<<s;//写入os输出流
is>>s;//读出is输入流
#include<iomanip>
cout<<setprecision(n)<<n;
//setprecision(n):设置输出有效数字
#include<iomanip>
#include<ios>
streamsize prec=cout.precision();
//std::streamsize:标准库内部定义的一个整数类型
//precision()返回当前浮点数精度
equal(a.begin(),a.end(),b.begin());
//提供a的收尾为比较范围,判断ab是否相等
equal(a.begin(),a.end(),b.begin(),b.end());
//要求容器相同,判断a,b是否相同

vector

保存同一类型的多个数值,可变长度

vector<类型> 类型名;
vector.push_back(x);
#include<algorithm>
sort(vector.begin(),vector.end());
//默认非降序排序

vector.begin() 容器的第一个元素
vector.end() 容器最后一个元素的下一个位置

vector.erase(i);
//删除vector中元素
mid=size%2==0?(array[mid]+array[mid])/2:array[mid];
//求中值
vector.insert(ret.loc,const TYPE &val ); 
//在指定位置前加入val,返回指向这个元素的迭代器
vector.insert(ret.loc,int num,const TYPE &val); 
//在指定位置前加入num个val
vector.insert(ret.loc,input_iterator start,input_iterator end); 
//在指定位置前插入区间[start, end)的所有元素

list

对比vector&list:list

map

储存key-value集合(python的dict),每个元素都是一个pair,包含first和second两个元素(it->first,it->second)

迭代器

一种设计模式,自动返回下一个元素,一种smart pointer
能够依次访问容器内的元素,又不暴露容器的内部表达形式
5种STL迭代器:
输入迭代器(读取数据,把迭代对象指向下一个)

for(istream_iterator<int>i=cin; i!=istream_iterator<int>(); ++i)
       v.push_back(*i);

输出迭代器(数据储存到序列,只能写不能读,不能倒带)

int tmp;
while(ifile>>tmp) cout<<tmp;

copy(istream_iterator<int>(ifile), istream_iterator<int>(),ostream_iterator<int>(cout));

前向迭代器(输入+输出)

void replace(FI first,FI last, const T& x,const T& y){
  for(;first!=last;++first)//输入
    if(*first==x)
			*first=y;//输出

双向迭代器(两个方向访问元素,只限于单步移动:list, set, multiset, map, multimap)

template<class BI,class Compare>
void bubble_sort(BI first,BI last, Compare comp){
	while(first != last){
		for(BI r = first+1;r!=last;r++){
			if(comp(*r,*(r-1)))
			{ BI::value_type rv = *r; *r = *(r-1);
			*(r-1) = rv;
		} }
		first++; }
}

随机访问迭代器(两个方向访问元素,可以以任意下标访问:vector, deque)

vector<int>::iterator i=v.begin(); 
vector<int>::iterator j=i+2;
      cout<< *j<<"";
	  i+=3; 
	  cout<< *i<<"";

在这里插入图片描述

for(vector<int>::iterator iter(迭代变量名) = a.begin();iter != a.end(); ++iter)
{
    cout << *iter << endl;
}

每个STL容器都定义了两个迭代器:

container-type::const_iterator//不可改变容器内值
container-type::iterator

异常

抛出异常时,程序会停止在出现异常的地方,并把异常对象传出

throw domain_error("median of an empty vector");
//domain_error: 用来说明一个函数的实参是这个函数不能接受的。

try-catch:

try{
	}catch(异常类型){}

尝试执行try后的函数语句,如果有异常,会跳转执行catch中的语句,如果无异常,直接跳过catch

无名对象

cout<<string(maxlen+1-students[i].name.size(),' ');
//变量的名字是spaces(?)

引用

给对象的一个别名,指向同一内存单元
主要目的:让函数能设置引用形参(形参==实参)

数据类型 & 标识符(左值表达式);
数据类型 & 标识符=左值表达式;

区别于指针:
引用必须初始化,指针可以指向NULL
引用不可改变映射,指针可以改变指向
没有引用的引用,(?)没有引用的指针没有引用的数组

const int &s1=s2;
const int &s3=s1;
int &s4=s1;//错误!静态变量必须由静态变量引用
//保证不会改变s1的值

引用形参必须接受一个左值

函数返回值为引用时:
函数调用可以出现在等式左侧
不能返回函数内部局部变量的引用
返回时不用生成临时对象

函数参数的三种形式

double fun(int a){}

复制实参,不改变实参

double fun(int &a){}

不复制实参,改变实参

double fun(const int &a){}

不复制实参,不改变实参


重载 Overload

相同函数名,不同参数列表

随机数

计算机的随机数是伪随机数
蒙特卡洛方法

srand(unsigned(yime(0)));//使用前要随机化,否则产生的序列是相同的
int i=rand(1000);

find-if

对数组、STL容器进行查找

#include <algorithm>

list<int>::iterator it = find(lst.begin(), lst.end(), 10); 
// 查找list中是否有元素10
// find函数没有找到对应值,返回第二个参数
list<CPerson*>::iterator it = find_if(lst.begin(),lst.end(), func);
// 自行定义查找,func为谓词,返回第一个让func返回true的值
isspace(char c) //库函数,检查所传的字符是否是空白字符

isspace是重载的函数(支持多种数据类型),不能作谓词,需要将其重新封装

泛性函数

使用之前不知道参数类型和返回值类型(例如find函数)
一般形式:前两个参数是一对迭代器,表示算法操作的区间[first,last)
函数泛化:参数的数据类型抽象化+操作对象的表示和行为抽象化

泛型算法

作用于迭代器而非容器
主要为:不变值算法、变值算法、排序算法、数值算法
vector 和 deque支持随机迭代器;
list, map, set, multimap 和 multiset支持双向迭代器
迭代器支持方法:begin()/end() 和 rbegin()/rend();


第一周上课讨论

大一的同学们真的太积极了…问了超多问题…(・-・*)

endl
endl是流操作符,在输出的同时清空缓存区(调用flush亦可)
程序正常退出时,也会自动清空缓存区

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!