《C++ Primer》学习之vector

基本知识就不用赘述了,说一些值得注意的要点:

1.vector 不是数据类型,不像int char 等vector<int>才是

2.vector在进行使用的时候可以预先分配内存,但这是不必要的,甚至多此一举,影响vector效率。在元素值已知的情况下最好动态添加元素

3.在对vector进行初始化的时候,如果没有指定元素的初始化式(明确赋值),那么标准库将自行提供一个元素初始值。这个值根据vector<type>中type的类型而定。例如,如果是

    int类型的话就是0.如果是string等类类型的话,标准库将使用该类的构造函数作为创建元素初始化式。如果一些自定义构造函数没有默认构造函数的类,在初始化这种类型对象时

   程序员就不能仅提供元素个数,还需要提供元素初始化值。还有元素类型可能是没有定义任何构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的      每个成员进行了值初始化

4.与c和java不同,在for循环中C++习惯用!=代替<。在for循环之前没有调用size成员函数并保存其返回值,而是在for()中每次都进行调用,之所以这样是因为vector是动态增长的,随时size的值都可能变化,当size被声明为内联函数时,这里其每次循环过程调用运行时代价都是比较小的,并不会占用太多的运行时间。

5.每种容器都有一种const_iterator迭代器,其只能访问容器中的元素,但不能对其进行更改。其与const的迭代器完全不同,声明一个const迭代器时必须进行初始化,一旦初始化之后就不能改变它的值

6.对迭代器的关系操作符>,>=,<,<=。在C++容器类型中,只有vector和deque容器才有这些操作符。当一个迭代器指向的元素在容器中位于另一个迭代器指向的元素之前,则前一个迭代器小于后一个迭代器。关系操作符的两个迭代器必须指向同一个容器的元素或超出容器末端的下一个位置。


容器选择:

(1)如果程序要求随机访问元素,则应使用vector或deque容器。

(2)如果程序必须在容器的中间位置插入或删除元素,则应采用list容器。

(3)如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应该采用deque。

(4)如果只需在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则应该考虑在输入时将元素读入到一个list容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的list容器复制到一个vector。

(5)如果程序既需要随机访问又必须在容器的中间位置插入或删除元素,此时选择何种容器取决于下面两种操作付出的相对代价:随机访问list容器元素的代价,以及在vector或deque容器中插入/删除时赋值元素的代价。通常来说,应用中占优势的操作(程序中更多使用的是访问操作还是插入/删除操作)将决定应该选择什么类型的容器。决定使用哪种容器可能要求剖析各种容器类型完成应用所要求的各类操作的性能


容器适配器:

adapter原意是插座、适配器、接合器的意思。现在我需要一个栈结构,我们可以用deque来实现,只在一端进行元素插入和弹出,另一端不动。这说明deque可以用作一个栈结构,但它又不能直接地严格地满足你的要求,因为你不能防止别人在另一端乱动你的东西。你需要对它进行一些包装,作一些限制,使之只能在一端进行插入和删除。也就是说你必须提供一个“插座”,这个“插座”一端插在deque上,另一端插在你的程序中,你就可以使用栈结构了。而stack就是这样的“插座”,它连接了deque和你的程序。表面上看你使用的是stack,实际上你是通过stack这个“插座”来使用deque(因为stack完全是用deque来实现的,它并没有任何其他的东西,它只是在deque上面作了一层包装,相当于一个“插座”的功能)。因此,stack、queue、priority_queue这样的类一般称为容器适配器,它们只是基本容器类型(vector,dequeue,list)的适配。

实际上,这也适配器模式的基本思想:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。也就是说,在一个类的接口上提供一个“插座”类,使它变成你希望使用的接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值