第二部分 容器和算法

顺序容器类型
顺序容器
vector 支持快速结束随机访问
list   支持快速插入、删除
deque  双端队列

顺序容器适配器
stack 堆栈
queue 队列
priority_queeu 有优先级管理的队列

所有的容器都是类模板,所有容器都定义了默认构造函数,用于创建指定类型的空容器对象。

 

容器元素类型必须满足:
    1.元素类型必须支持赋值运算
    2.元素类型的对象必须可以复制
iostream类型不支持赋值和复制,不能使用容器来存储iostream对象

容器的容器
    因为容器受容器元素类型的约束,所以可定义元素是容器类型的容器。
注意,在指定容器元素为容器类型时,必须如下使用空格:
vector< vector<string> > lines; //ok
vector< vector<string>> lines; //error:treated as shift operator

计算vector对象的中点位置:
vector<int>::iterator iter = vec.begin() + vec.size()/2;

如果迭代器first和last标记出有效的迭代器范围,则必须满足:first和last指向同一个容器中的元素或超出末端的下一个位置;如果first和last不相等,则对first反复做自增运算必须能够达到last,即在容器中last不能位于first之前。


使用迭代器编写程序时,必须留意哪些操作会使迭代器失效。
使用无效的迭代器将会导致严重的运行时错误。

容器元素都是副本,使用一段元素初始化新容器时,新容器存放的是原始元素的副本。被复制的原始值与新元素中的各不相关。


不要存储end操作返回的迭代器,添加或删除deque或vector容器内的元素都会导致存储的迭代器失效。


顺序容器的大小操作:
c.size();
c.max_size();
c.empty();
c.resize(n); //调整容器C的长度大小
c.resize(n,t);


访问顺序容器内元素的操作:
c.back(); //返回容器c的最后一个元素的引用
c.front();//返回容器c的第一个元素的引用
c[n];  //返回下标为n的元素的引用
c.at(n);//返回下标为n的元素的引用

删除顺序容器内元素的操作:
c.erase(p);
c.erase(b,e);
c.clear();
c.pop_back();
c.pop_front();


顺序容器的赋值操作:
c1=c2;
c1.swap(c2);
c.assign(b,e);
c.assign(n,t);

capacity和reserve成员(vector)

string操作:
string s;
string s(cp);
string s(s2);
is>>s;
os<<s;
getline(is,s);
s1+s2;
s1+=s2;
Relational
Operators 关系操作符

构造/修改string对象的方法p448

string类型提供了容器类型不支持其他几种操作:
substr函数,返回当前string对象的字串
append和replace函数,用于修改string对象。
一系列find函数,用于查找string对象。

适配器:容器适配器,迭代器适配器,函数适配器。
适配器是使一事物的行为类似与另一个事物的行为的一种机制。
容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式。如,stack适配器可以使任何一种顺序容器以栈的方式工作。

适配器通用的操作和类型:
size_type
value_type
container_tpye
A a;
A a(c);
关系操作符

栈容器适配器支持的操作:
s.empty()
s.size()
s.pop()
s.top()
s.push(item)

队列和优先级队列支持的操作:
q.empty()
q.size()
q.pop()
q.front()
q.back()
q.top()
q.push(item)


第十章 关联容器

关联容器和顺序容器的本质区别在于:关联通过键存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。


关联容器类型:
map 关联数组:元素通过键来存储和读取
set 大小可变的集合,支持通过键实现的快速读取
multimap 支持同一个键多次出现的map类型
multiset 支持同一个键多次出现的set类型

pairs 类型提供的操作:
Pair<T1,T2> p1;
pair<T1,T2> p1(v1,v2);
make_pair(v1,v2)
p1<p2
p1==p2
p.first
p.second


第三部分 类和数据抽象

this指针:
成员函数具有一个附加的隐含形参,即指向该类对象的一个指针,this.与调用成员函数的对象绑定在一起,成员函数不能定义this形参,由编译器隐含的定义。
当需要将一个对象作为整体引用而不是引用对象的一个成员是,必须使用this。最常见的情况:该函数返回对调用该函数的对象的引用。
函数的返回类型是A&,指明该成员函数返回对其自身类类行的对象的引用。函数返回调用自己的那个对象。使用this指针来访问该对象,返回return *this。
在普通的非const成员函数中,this的类型是一个指向类类型的const指针,可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,都不能改变。不能从const成员函数返回指向类对象的普通引用。const成员函数只能返回*this作为一个const引用。

可变数据成员(mutable data member)永远都不能为const,甚至当它是const对象的成员时也如此,因此,const成员函数可以改变mutable成员,要将数据成员声明为可变的,必须将关键字mutable放在成员声明之前。

构造函数不能声明为const,创建类类型的const对象时,运行一个普通构造函数来初始化该const对象。构造函数的工作是初始化对象。不管对象是否为const,都用一个构造函数来初始化该对象。