写在前面:
IO这部分用的比较多,我就不写那些用的很多的东西了,捡一点二周目的小发现好了。
第八章:
1. 首先三个IO库还是要介绍一,iostream fstream sstream。简单说一下iostream很显然是用来做通用计算机外部内部IO的,fstream实际上是计算机内部的IO,sstream则是用于实现跟stdio.h类似的类型转换
2. IO的底层状态标志位:iostate,badbit,failbit,eofbit,goodbit。以及一些位操作函数如s.eof(),s.fail(),s.good(),通过检查这些标志位可以判断IO流的状态。当我们使用流作为条件判断时,我们相当于使用!fail()。
3. 输出流关联问题,被关联的缓冲区在关联缓冲区刷新时会被刷新。有点拗口,换个说法,cin.tie(&cout),cin关联到cout,cout被关联到cin,当cin被刷新时,cout也被刷新。一个流只能关联到一个,但是可以被多个流关联。
4. fstream的用法总结的博客很多,自己看一下就好。基本的open,close函数,基本的打开方式等等
5. string流更多的是对文本处理,典型例子就是使用getline获得一行,随便从哪里获得,标准输入就是cin,文件就fstrm,保存到一个string line里,然后使用line初始化一个stringstream对象,使用sstream的方法进行操作。
第九章:
1. 容器这个东西最形象的应该是vector,用的最多的大概也是vector。stl库中标准的容器类型如下:vector,list,string,deque,forward_list,array。我基友说除了前两个,他基本都不太用,emmmm我也觉得除了vector其他东西存在的意义不大,而且c11这里做的很一般,强调泛型算法,但又因为array之类的本身的定义就跟别的不一样,导致泛型方法无法调用,就很瓜皮,前三个的泛型算法还是做的挺好的。所有的容器都是模板类
2. vector:可变大小容器,尾部快速增长,但是内部插入可能很慢。
list:双向链表,内部插入很快。这个结构体的实现有人说大概就是一个前驱指针一个后驱指针,一个数据。没有[]访问符,在内存中不连续,(写过数据结构里双向链表的这些就不用看了)。插入快的原因大概是指针的快速索引吧。
deque:双端队列,头尾快速增长,比list多了[]索引,效率比vector高一些。这个鸟东西存在的意义,可能就是满足一部分人在高速头尾插入和使用[]的需求吧。。。。
3. 选取规则:
a) 除非有更好的选择,否则使用vector。
b) 如果你需要大量的中间插入和删除,而不关心随即存取,则应使用list。
c) 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
4. 构造函数,构造函数这里CPPP说的感觉不太清楚,构造函数就是用来声明或者直接初始化对象的,构造函数只给了四个,后面初始化部分又给了别的。
a) C c;//默认构造,空容器,不适用array.
b) C c1(c2);//构造c2的拷贝c1.
c) C c(b,e);//be应该为迭代器然后拷贝到c中,但是这个其实也可以起到string(n,‘c’)的作用,比如vector<int>vi1(10,5);或者vector<string> vs1(10,”fhfhskjf”);同时除了用(),还可以用{},但是中括号的时候,vector<int>vi2{10,15};就是一个列表初始化,只含有两个元素,10和15,不是10个15了。而string依然工作的很好。
d) C c{};//列表初始化,上述vector<int>的例子已说明。
5. 迭代器:这个东西大家用的都很多,就不细说了。记着对容器操作以后迭代器会失效就好了,这个编译器不报错的。
6. assign:这个东西还是有用的,他允许我们对两个类型不同但是相容的容器进行拷贝赋值,比如从list<string>到vector<const char*>的转换,因为不同类型,使用=是不行的,但是可以使用assign。相容这个东西很皮,int,char,之类的是相容的,char*和string是相容的。
7. swap:快速交换两个容器的数据,除了array,均在常数时间完成,不涉及拷贝复制。
8. 关系运算符:没啥好讲的,设计的数据结构可以使用它,用来顺序对比两者的大小。
9. 插入元素:
a) push_back/push_front
b) emplace_back/emplace_front//构造插入,比push少了局部变量,节约了开支括号内是初始化一个对象的参数。
c) insert//在指定迭代器前插入
10. 删除元素:
a) pop_back/pop_front
b) erase//不可删除尾后迭代器,只可到尾元素迭代器。
c) clear
11. string:
a) 几种基于指针的构造方法可以灵活的构建string对象。
b) substr(p,n)方法与构造形式类似。
c) insert与其他容器一致
d) erase一致
e) append
f) replace
g) find/rfing
h) find_first_of(args)
i) find_first_not_of(args)/注意搜索操作的args的形式,可以传入搜索起始位置pos,pos无默认值。
j) compare
静态函数
k) to_string(val)//val任意算数类型
l) stoi(s,p,b)//返回第一个表示整数内容的子串的数值(int型),b表示进制,p表示第一个非数值字符的下标。有i,l,ul,ll,ull型。
m) stof(s,p)//同上,返回float型,有f,d,ld型。
12. 适配器:
a) stack、queue、priority_queue
b) 均支持的操作:
i. 关系运算符
ii. a.empty()
iii. a.size()
iv. swap(a,b)
v. a.swap(b)
c) stack的操作:
i. s.pop()
ii. s.push(item)
iii. s.emplace(args)
iv. s.top()
d) queue的操作:
i. q.pop()
ii. q.front()
iii. q.back()
iv. q.top()
v. q.push(item)
vi. q.emplace(args)
#include<vector>
#include<string>
#include<iostream>
#include<list>
#include<stack>
using namespace std;
class tclass
{
public:
tclass()=default;
vector<string> get_vector(){return this->vec1;}
private:
vector<string> vec1{10,"pipipipipi"};
};
int main()
{
tclass t1;
vector<int> vi1(10,10);
vector<string> vs1(10,"200");
vector<char> vc1(10,'p');
list<int> li1(11,5);
stack<int> is;
auto v=t1.get_vector();
v.push_back("aloha");
auto vi=v.begin();
vi=v.insert(vi,"pipipipipipi");
for(auto it:v)
{
cout<<it<<endl;
}
for(auto it:vi1)
{
cout<<it<<endl;
}
for(auto it:vs1)
{
cout<<it<<endl;
}
li1.assign(vc1.begin(),vc1.end());
for(auto it:vc1)
{
cout<<it<<endl;
}
return 0;
}