C++Primer 二周目笔记(八、九):IO库及顺序容器

写在前面:

    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;
}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭