开学第一天!印象笔记用的太不顺手,还是把笔记搬到这里吧~
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:
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亦可)
程序正常退出时,也会自动清空缓存区
来源:CSDN
作者:Rachel_IS
链接:https://blog.csdn.net/Rachel_IS/article/details/104473642