C++第五章学习

在Ubuntu上找到了一款不错的笔记软件,zim 桌面维基,可以将自己学的内容进行简单的归类。以下是这两天的知识回顾。

字符串

创建日期 星期一 23 三月 2020
string 类 :

头文件:#include <string>

stringstream类

头文件:#include <sstream>
可以将整数输入到sstream中并且在输出的时候可以输出字符串(可以使用流)
比较重要的函数:stringstream ss
ss.str() 用来输出ss里保存的字符串
ss.clear()用于清空原来的状态,比如说当ss输出的时候到达了输出流的末端,那么就无法使用<<进行输入,所以需要清除状态
ss.("")用于清空原来的流
ss("123456")用于初始化,此外遇到非数字的字符会停止

 

getline(cin,line) 用于得到一行的输入

注意,停止输入是ctrl+D来停止输入 在while(cin>>ss)中 ,回车键是不能结束输入的。

 

 

结构体

创建日期 星期一 23 三月 2020
struct 类 (c++ 不再使用typedef方法定义一个struct,也就是变量定义从原来的 struct book 可以直接用book 代替)

理解:现在的struct 可以像class一样,拥有自己的成员变量也可以拥有自己的成员函数。

Point(int x=0,int y=0): x(x),y(y) {} 这个是简便的构造方法,等价于 {this->x=x;this->y=y;) 此外构造函数可以拥有自己的默认值。

在C++结构体的成员函数中,this是指向当前对象的指针,所以会看到 return *this 的出现

 

模板

创建日期 星期一 23 三月 2020
template <typename T>
T sum(T* begin,T*end) ;
所以就可以对任意的数据类型进行sum 函数的计算
sum(Point (3,4),Point(5,6));
注意:并不是所有的都可以,因为这个模板使用到的运算符必须全部拥有,就比如说Point类并没有定义+=所以就不能进行+=的运算

对于struct 和类都可以带模板 比如:
template <typename t>
struct Point{

T x,y;
Point(T x=0,T y=0){};

}

 

vector

创建日期 星期一 23 三月 2020
vector 是一个不定长数组,即数组的大小是可以变化的。vector也是一个模板类,所以需要通过vector<int>声明一个vector

以下是vector 的常用的操作:
vecotr a;

a.size() 读取大小
a.resize() 改变大小,但是不会改变原来的数值,比如原来是10个,但是通过resize( 5 ) 变为大小为5 ,但是如果重新变为10 那么原来的数据仍然是存在的。
a.push_back() 向尾部添加元素
a.pop_back() 向尾部删除最后一个元素
a.clear() 清空函数
a.empty() 测试是否为空

 

iterator

创建日期 星期二 24 三月 2020
功能:相当于C语言中的指针。
例子:set<string> :: iterator it = dict.begin()
iterator 迭代器,相当于C语言中的指针

 

map

创建日期 星期一 23 三月 2020
功能:映射:

map就是从键(key)到值(value)的映射。
因为重载了[ ]运算符,map像是数组的“高级版”。
例如可以用一个map<string,int>month_name来表示“月份名字到月份编号”的映射,
然后用month_name["July"]=7这样的方式来赋值。

函数:

month_name.count("July")用来查询是否存在,返回一个布尔数,相当于find()函数。
增添:month_name["July"]=0,自动添加,即"July"对应的键值是0 。

注:set头文件中的set和map头文件中的map分别是集合与映射。二者都支持
insert、find、count和remove操作,并且可以按照从小到大的顺序循环遍历其中的元素。
map还提供了“[]”运算符,使得map可以像数组一样使用。事实上,map也称为“关联数

 

operator

创建日期 星期一 23 三月 2020

其实C++最令我感到神奇的其中之一就是这个函数,可以自己定义对应的运算符

在自己定义运算符的时候需要注意,在成员函数中不能有过多的参数,如下

Point operator + (Point& A ,Point& B){

return Point(A.x+B.x,A.y+B.y)

}
首先值得注意的是开头的Point 指明函数的返回类型,然后operator 后是对应的运算符,最后是参数,这里的参数不是值传递,而是引用的方式,更改的同时会对原来的值进行修改,这里相当于指针的简化版。

下面是另一个运算符的应用
ostream& operator << (ostream& out ,string s)

大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数。如果我们定义上面的函数为类的非成员函数,那么我们需要为每次操作传递两个参数。

 

set

创建日期 星期一 23 三月 2020
模拟数学中的集合。和sort 一样,自定义类型也可以构造set,但是必须定义“小于”运算符,set也是一个模板类,set<string > dict

例子 set<string > dict;

dict.insert( buf) 向集合中插入一个元素
dict.begin() 返回集合中第一元素的指针
dict.end() 返回集合中最后一个元素的指针
注:set<string> :: iterator it = dict.begin()
iterator 迭代器,相当于C语言中的指针
 

栈,队列与优先队列

创建日期 星期二 24 三月 2020
栈:先进后出

STL的栈定义在头文件<stack>中,可以用“stack<int>s”方式声明一个栈。

函数:

push() 入栈操作
pop() 出栈操作
top() 取栈顶元素,但是不删除。

队列 先进先出

STL队列定义在头文件<queue>中,可以用“queue<int>s”方式声明一个队列。

函数:

push() 入队
pop() 出队
front() 取队首元素(但不删除)

优先队列:队列中存在优先级

 

STL的优先队列也定义在头文件<queue>里,用“priority_queue<int>pq”来声明。这个pq是
一个“越小的整数优先级越低的优先队列”。由于出队元素并不是最先进队的元素,出队的方法由queue的front( )变为了top( )
对于自己定义的类型,只要定义了“小于”运算符,就可以使用优先队列。
比如一个“个位数大的整数优先级反而小”的优先队列。
做法:定义一个结构体cmp ,重载"()“运算符(使其看上去像一个函数)
用“priority_queue<int,vector<int>,cmp>pq”的方式定义。参数解释:第一个是int 类型,第二个是存储变量的容器,最后一个是优先级定义函数)

struct cmp { //a 的优先级比b小时返回true

bool operator() (const int a, const int b) const {
return a % 10 < b % 10;
}

};

 

测试

创建日期 星期二 24 三月 2020
assert()
测试时往往使用assert。其用法是“assert(表达式)”,当表达式为假时强行终止程序,并给出错误提示。

rand() 与srand()
通过rand()获得随机数,先进行归一化然后乘以需要的变量的范围
srand() 设置随机数种子,在进行试验中一般初始化一次随机数种子,一般是srand( time(null)) 。

 

原文链接: https://www.cnblogs.com/wxb1314520/p/12557683.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++第五章学习

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/337268

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午11:04
下一篇 2023年3月1日 下午11:05

相关推荐