STL总结

总结STL之前先说几个前面的知识,首先是重载赋值运算符(针对常成员无法直接赋值的问题)
类名 & operator=(const 类名 & 对象名){
常成员数据类型 temp=const_cast<常成员数据类型>(& 常成员名)
*temp=对象名.常成员名
……
return *this
}
实例(id是常成员):
People & operator=(const People &b){ //重载赋值运算符
string temp=const_cast>(&id);
*temp=b.id;
……
return *this
}

这是前面第一次通讯录作业中遇到的问题,老师当时有提示过,当时也是上网查过很多内容,可不知道是因为关键词把握不好还是怎么的就是查不到相关的办法,怎么也解决不了,后来作业结束后老师就告诉我们可以这么解决,老师说他也是上网查的资料,当时就觉得挺无奈的为啥我就找不到呢哈哈,看来自己还是不太灵活呀,慢慢积累吧。
再说一下文件操作吧,
文件操作
c++把文件看成无结构的字节流,
编码方式:文本文件 二进制文件
存取方式:顺序文件 随机文件
ifstream、ofstream和fstream类用于内存与文件之间的数据传输
要执行文件的输入输出
1.首先要包含头文件fstream
2.再建立文件流(定义流类的对象)
ifstream fin(读文件)、ofstream fout(写文件)、fstream finout(读/写文件)
3.使用open()函数打开文件,使文件与流相联系
4.对open结果进行检查
5.进行读写
6.关闭文件流对象
具体怎么用,举个例子吧
#include
#include
using namespace std;
int main(){
ofstream fout;
string filename;
cin>>filename;
fout.open(filename.c_str(),ios::out); //建立文件信息区 这一行要特别注意那个c_str(),文件名是通过输入产生的字符串形式的话,要把它转换成C语言的风格(字符数组字符的格式)
fout<<10<<" “<<123.456<<” "<<“This is a text file.\n”;
fout.close();
return 0;
}

文件打开方式
ios::in //供读
ios::out //供写,文件不存在则创建,若文件已存在则清空原内容
ios::ate //文件打开时,指针在文件尾部。可改变指针的位置,常和in、out联合使用
ios::app //供写,文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后
ios::trunc //在读写前先将文件长度截断为0(默认)
ios::binary //二进制格式文件

复制一个文件的操作其实就是把这个文件读出来然后再写到另一个文件里
文本文件用默认方式打开
文本文件用文件流对象(文本文件流)进行读/写操作
文本文件是顺序存取文件
通常一个逻辑记录用换行符分隔;数据项之间可以用空白符、换行符、制表符等分隔
文件中只存储了数据,没有存储记录的逻辑结构
每条记录的长度是不同的
只能顺序访问每一条记录

二进制文件以基本类型数据在内存的二进制表示形式存放数据,不对写入或读出的数据做格式转换
二进制文件的读写方式由程序控制
打开二进制文件用binary方式
二进制文件是随机存取文件
文件中只存储了数据,没有存储记录的逻辑结构
每条记录的长度是相同的
可以随机访问每一条记录
文件的随机读写
在c++的I/O系统中有个文件指针,它有两个名字
其中一个名字叫get指针,用于指出下一次输入操作的位置;
另一个名字叫做put指针,用于指出下一次输出操作的位置。

好了该切入正题了,STL:
C++ 标准模板库
C++ Standard Template Libarar(简称STL)
STL由一些可适应不同需求的集合类,以及在这些数据集合上操作的算法构成
STL内的所有组件都由模板构成,其元素可以是任意类型
STL是所有C++编译器和所有操作系统平台都支持的一种库

一个小知识点:
STL的区间都是左闭右开的

STL组件
容器 -管理某类对象的集合
迭代器 -在对象集合上进行遍历
算法 -处理集合内的元素
容器适配器
函数对象

容器类别
序列式容器-排列次序取决于插入时机和位置 vector、deque、list
关联式容器-排列顺序取决于特定准则 set、map

STL容器的共同能力
所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指针
所有元素都形成一个次序,可以按相同的次序一次或多次遍历每个元素

STL容器元素的条件
必须能够通过拷贝构造函数进行复制
必须可以通过赋值运算符完成赋值操作
必须可以通过析构函数完成销毁动作
序列式容器元素的默认构造函数必须可用
某些动作必须定义operator==,例如搜寻操作
关联式容器必须定义出排序准则,默认情况是重载operator<

对于基本数据类型(int、long、char、double……)而言,以上条件总是满足

vector
模拟动态数组
元素可以是任意类型,但必须具备赋值和拷贝能力
必须包含的头文件#include<vector>
vector支持随机存取
写几个常用的操作吧:
vector<T> c 产生空的vector
vector<T> c1(c2) 产生同类型的c1,并将复制c2的所有元素
vector<T> c(n,e) 产生一个大小为n的vector,每个元素都是e
~vector<T>() 销毁所有元素并释放内存
c.size() 返回元素个数
c.empty() 判断容器是否为空
c.capacity() 返回重新分配空间前可容纳的最大元素数量
c.reserve(n) 扩大容量为n
c1=c2 将c2的全部元素赋值给c1
c1.swap(c2) 将c1和c2元素互换
swap(c1,c2) 同上,全局函数
begin() 返回一个迭代器。指向第一个元素
end() 返回一个迭代器。指向最后一个元素之后(之后,一定要注意!)
c.insert(pos,e) 在pos位置插入元素e的副本,并返回新元素位置
c.push_back(e) 在尾部添加一个元素e的副本
c.pop_back() 移除最后一个元素但不返回最后一个元素
c.erase(pos) 删除pos位置的元素,返回下一个元素的位置
c.clear() 移除所有元素,清空容器

map/multimap
使用平衡二叉树管理元素
元素包含两部分(key,value),key和value可以是任意类型
必须包含的头文件#include<map>
根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢,不能直接改变元素的key,可以通过operator[]直接存取元素
map中不允许有key相同的元素,但multimap允许
map很多操作和vector是相似的,比如插入insert、清空clear、empty判空等等,毕竟都是容器,有一些共性,这是我的理解。
说几个map比较特别的搜寻操作:
find(key)返回键值等于key的第一个元素,找不到返回end,这里要注意“第一个”,查到的是键值为key的第一个元素。
lower_bound(key)返回键值大于等于key的第一个元素,upper_bound(key)返回键值大于key的第一个元素,这两个结合起来可以用于区间查找。
equal_range(key)返回键值等于key的元素区间,不过老师说这个不太经常用,主要还是用上边那两个。
插入操作其实也需要稍微注意一下,因为map里存的是键值对,所以插入的时候也要插键值对,这里可以用make_pair来构造键值对进行插入,举个例子:
multimap m;
m.insert(make_pair(“abc”,1));

set/multiset
使用平衡二叉树管理元素
集合(Set)是一种包含已排序对象的关联容器
必须包含的头文件#include<set>
map容器是键-值对的集合,好比以人名为键的地址和电话号码。相反的,set容器只是单纯的键的集合。当我们想知道某位用户是否存在时,使用set容器是最合适的
set中不允许有key相同的元素,但multiset允许
集合老师讲的不多,大体上跟map也是类似的,比较特别的是集合有交并补的运算,可以用特定的算法进行操作,这个可以与map结合起来实现组合查找。

再就是算法了,需要包含的头文件#include<algorithm>
老师给我们列举了很多常用的算法,如果将来用的到可以上网去搜一下它们具体的相关用法。算法是基于泛型也就是模板的,具体用起来可能有些地方不是很好理解,可以先去多了解一些泛型和模板的知识再来体会。
老师还跟我们说将来找工作面试的时候人家问你的一般都是很多东西背后的原理实现,所以STL很多相关功能背后的实现原理也需要额外注意一下,尽量多了解一些。
最后再说说最近的体会吧,上网课上了这么久,要说没一点懈怠是不可能的,学的课程感觉挺杂的,也不太知道该把重点往哪偏一下,有时候也觉得挺迷茫的,但路都是自己选的,既然已经转了专业,就该好好学。憋在家里太久了,多少有点浮躁很正常,希望自己可以静下心来,虽然咱脑子不太聪明,但该有的毅力得有,好好加油吧~

你可能感兴趣的:(笔记)