C++ Primer标准库难点总结

最近在看C++ primer这本书的知识点,这里把8~12章标准库的难点总结了下。

1 count<<“hi”<<endl; //输出hi和一个换行,然后刷新缓冲区

   Count<<“hi”<<flush; //输出hi,然后刷新缓冲区,不附加任何额外字符

   Count<<“hi”<<ends; //输出hi和一个空字符,然后刷新缓冲区

 

2 顺序容器:

   Vector:  可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。

   Deque: 双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。

   List:   双向链表。只支持双向顺序访问。

   Forward_list:  单向链表。只支持单向顺序访问。

   Array:固定大小数组。支持快速随机访问。不能添加或删除元素。

   String: 与vector相似容器,随机访问快。在尾部插入/删除速度快。

 

3 容器列表初始化:

   List<string> authors={“Milton”,”Shakespeare”,”Austen”};

   Forward_list<int> ivec(10); //10个元素,每个都初始化为0

 

4 int digs[10]={0,1,2,3,4,5,6,7,8,9};

   Int cpy[10]=digs;  //错误:内置数组不支持拷贝或赋值

   Array<int,10> digits={0,1,2,3,4,5,6,7,8,9};

   Array<int,10> copy=digits;  //正确,只要数组类型匹配

 

5 使用push_back

   String word;

   While(cin>>word)

     Container.push_back(word);

 

6 使用emplace操作,当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。当我们调用一个emplace成员函数,则是将参数传递给元素类型的构造函数。

 

7 vector的capacity()代表容量一般大于等于size()

 

8 vector<int> vec;

   fill_n(vec.begin(),vec.size(),0);//将所有元素重置为0

 

9 vector中unique并不是真的删除任何元素,它只是覆盖相邻的重复元素,使得不重复元素出现在序列开始部分。

 

10 lambda表达式:

    [capture list] (parameter list) -> return type {function body} 捕获列表只用于局部非static变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字。

    &告诉编译器采用捕获引用方式,=则表示采用值捕获方式。

 

11 可变lambda,对于一个值被拷贝的变量,lambda不会改变其值。如果希望改变一个被捕获的变量的值,就必须在参数列表加上关键字mutable。

    Size_t v1=42;

    Auto f=[v1]() mutable{return ++v1;};

    V1=0;

   Auto j=f();

 

12  一个map或set中的关键字必须是唯一的,对于一个给定的关键字,只能有一个元素关键字等于它。容器multimap和multiset没有限制,它们都允许多个元素具有相同的关键字。

 

13 set的迭代器是const的

     set<int> iset={0,1,2,3,4,5,6,7,8,9};

     Set<int>::iterator set_it= iset.begin();

     If(set_it !=iset.end()){

       *set_it=42;//错误,set中的关键字是只读的

       Cout<<*set_it<<endl;

     }

 

14 new在动态内存中为对象分配空间并返回一个指针该对象的指针,我们可以选择对对象进行初始化;delete接受一个动态对象的指针,销毁该对象,并释放与之关联的内存。

 

15 智能指针:

     shared_ptr允许多个指针指向同一个对象;unique_ptr则独占所指向的对象。标准库还定义了一个名为weak_ptr的伴随类,是一种弱引用,指向shared_ptr所管理的对象。

     最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准函数。此函数在动态内存中分配一个对象并初始化它。

     Shared_ptr的析构函数会递减它所指向的对象的引用计数。如果引用计数变为0,shared_ptr的析构函数会销毁对象,并释放它占用的内存。

 

16 内存释放:

     Int *p(new int(42));

     Auto q=p;

     Delete p;

     p=nullptr;

 

17 unique_ptr拥有指向的对象,unique_ptr不支持普通的拷贝或赋值操作:

     Unique_ptr<string> p1(new string("ss"));

     Unique_ptr<string> p2(p1); //错误:不支持拷贝

     Unique_ptr<string> p3;

     p3=p2;  //错误:unique_ptr不支持赋值

 

18 weak_ptr是一个不控制所指向对象生存期的智能指针,它指向一个shared_ptr管理的对象。将weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。

    Auto p=make_shared<int>(42);

    Weak_ptr<int> wp(p);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值