STL总结

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STL(Standard Template Library)算法是C++标准库中的一组通用算法,用于处理各种类型的数据结构。STL算法提供了一系列函数对象和迭代器,以便能够对容器中的元素进行常见的操作,如查找、排序、删除、替换等。 STL算法主要分为以下几类: 1. 非修改性算法:这类算法不会改变容器中的元素,例如查找、计数、比较等。常用的函数包括find、count、equal等。 2. 修改性算法:这类算法会修改容器中的元素,例如排序、删除、替换等。常用的函数包括sort、remove、replace等。 3. 排序算法:STL提供了多种排序算法,如快速排序、归并排序等。常用的函数包括sort、stable_sort等。 4. 数值算法:这类算法主要用于数值计算,如求和、积累、内积等。常用的函数包括accumulate、inner_product等。 5. 集合操作:这类算法主要用于集合的操作,如交集、并集、差集等。常用的函数包括set_intersection、set_union等。 STL算法的优势在于其通用性和高效性。通过使用STL算法,我们可以在不同类型的容器上进行相同的操作,避免了针对不同容器实现不同操作的麻烦。此外,STL算法的底层实现经过优化,通常比手动编的算法更高效。 总之,STL算法是C++标准库中提供的一组通用算法,用于处理各种类型的数据结构。通过使用STL算法,我们可以方便地对容器进行各种操作,提高开发效率并保证程序的高效性。 ### 回答2: STL算法是C++标准模板库(Standard Template Library)中的一部分,它提供了丰富的算法操作,方便我们在处理数据时进行快速、高效的操作。 STL算法包含很多算法函数,比如排序(sort)、查找(find)、替换(replace)、去重(unique)、合并(merge)等等。这些算法函数可以处理各种数据容器,比如数组、容器、字符串等。 STL算法的使用非常方便,我们只需要包含<algorithm>头文件,并使用其中的函数即可。例如,我们可以使用sort函数对一个数组进行排序,使用find函数在容器中查找某个元素,使用replace函数替换容器中的某个值等等。 STL算法的好处是它提供了统一的接口和一致的命名规范,使得我们在处理不同的数据结构时都能使用相同的函数名来调用相应的操作。这样可以大大提高代码的复用性和可读性,减少了我们编和维护代码的工作量。 此外,STL算法还可以通过函数对象(function object)、谓词(predicate)等机制来灵活地进行自定义操作。我们可以自定义比较函数来实现按照特定条件进行排序,或者自定义判断函数来在查找时指定特定的条件等。这样可以让我们的代码更加灵活和可扩展。 总之,STL算法是C++中非常重要和强大的一部分,它提供了丰富的算法函数,方便我们在处理数据时进行各种操作。它的使用简单方便,可以提高代码的复用性和可读性,是C++开发中不可或缺的工具之一。 ### 回答3: STL(Standard Template Library,标准模板库)是C++中的一个重要部分,其中的算法部分(Algorithm)是其核心。STL Algorithm提供了一组强大的算法,用于对各种容器(如数组、向量、列表等)中的元素进行各种操作和处理。 STL算法可以分为若干类别,其中包括常用算法、排序算法、查找算法、数值算法等等。常用算法如copy(复制)、find(查找)、transform(转换)等,它们可以快速且高效地完成各种常见的操作。排序算法如sort(排序)、stable_sort(稳定排序)等,可以根据指定的规则对容器中的元素进行排序。查找算法如binary_search(二分查找)和lower_bound(寻找下界)等,可以在有序容器中快速查找指定元素。数值算法如accumulate(累加)、partial_sum(部分求和)等,用于对数值进行处理和计算。 STL的优势在于其算法的可重用性和通用性。STL Algorithm是基于模板的设计,它可以适用于不同类型的容器和元素。无论是基本数据类型还是自定义类型,只要满足一定的要求(如支持迭代器),就可以使用STL算法对其进行操作。这种通用性使得STL Algorithm可以被广泛应用于各种场景,大大提高了开发效率。 总结来说,STL算法是C++中的一组强大工具,用于对各种容器中的元素进行各种操作和处理。它的通用性和可重用性使得开发者可以更加高效地完成各种任务,提高代码的可读性和可维护性。无论是在日常开发中还是在算法竞赛中,STL Algorithm都扮演着重要的角色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值