最近在看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);