当前位置:编程学习 > C/C++ >>

C++ Primer_顺序容器杂记

适配器是根据原始的容器类型所提供的操作,通过
定义新的操作接口,来适应基础的容器类型。顺序容器适配器包括 stack、
queue 和 priority_queue 类型


顺序容器    
list  支持快速插入/删除
deque  双端队列
顺序容器适配器
stack  后进先出(LIFO)堆栈
queue  先进先出(FIFO)队列
priority_queue 有优先级管理的队列


在大多数的程序中,使用默认构造函数能达到最佳
运行时性能,并且使容器更容易使用。


容器构造函数


C<T> c;  创建一个名为 c 的空容器。C 是容器类型名,如 vector,T 是元素
类型,如 int 或 string 适用于所有容器。
C c(c2);  创建容器 c2 的副本 c;c 和 c2 必须具有相同的容器类型,并存放
相同类型的元素。适用于所有容器。
C c(b,e);
创建 c,其元素是迭代器 b 和 e 标示的范围内元素的副本。适用于
所有容器。
C c(n,t);
用 n 个值为 t 的元素创建容器 c,其中值 t 必须是容器类型 C 的
元素类型的值,或者是可转换为该类型的值。
只适用于顺序容器
C c(n);  创建有 n 个值初始化(第 3.3.1 节)(value-initialized)元素
的容器 c。
只适用于顺序容器


将一个容器复制给另一个容器时,类型必须匹配:容器类型和
元素类型都必须相同。


尽管不能直接将一种容器内的元素复制给另一种容器,但系统允许通过传递
一对迭代器(第 3.4 节)间接实现该实现该功能。使用迭代器时,不要求容器
类型相同。容器内的元素类型也可以不相同,只要它们相互兼容,能够将要复制
的元素转换为所构建的新容器的元素类型,即可实现复制。


C++ 语言中,大多数类型都可用作容器的元素类型。容器元素类型必须满足
以下两个约束:
1.   元素类型必须支持赋值运算。
2.   元素类型的对象必须可以复制。


IO 库类型不支持复制或赋值。因此,不能创建存放 IO 类型对象的容器。


容器的容器


// note spacing: use ">>" not ">>" when specifying a container element type
 vector< vector<string> > lines; // vector of vectors
注意,在指定容器元素为容器类型时,必须如下使用空格:
     vector< vector<string> > lines; // ok: space required between close >
     vector< vector<string>> lines; // error: >> treated as shift operator
 
C++ 语言使用一对迭代器标记迭代器范围(iterator range),这两个迭代
器分别指向同一个容器中的两个元素或超出末端的下一位置,通常将它们命名为
first 和 last,或 beg 和 end,用于标记容器中的一段元素范围。
尽管 last 和 end 这两个名字很常见,但是它们却容易引起误解。其实第
二个迭代器从来都不是指向元素范围的最后一个元素,而是指向最后一个元素的
下一位置。该范围内的元素包括迭代器 first 指向的元素,以及从 first 开始
一直到迭代器 last 指向的位置之前的所有元素。如果两个迭代器相等,则迭代
器范围为空。
此类元素范围称为左闭合区间(left-inclusive interval) ,其标准表示
方式为:
     // to be read as: includes first and each element up to but not
including last
     [ first, last )
 
表示范围从 first 开始,到 last 结束,但不包括 last。迭代器 last 可
以等于 first,或者指向 first 标记的元素后面的某个元素,但绝对不能指向
first 标记的元素前面的元素。


使迭代器失效的容器操作


一些容器操作会修改容器的内在状态或移动容
器内的元素。这样的操作使所有指向被移动的元素的迭代器失效,也可能同时使
其他迭代器失效。使用无效迭代器是没有定义的,可能会导致与悬垂指针相同的
问题。
例如,每种容器都定义了一个或多个 erase 函数。这些函数提供了删除容
器元素的功能。任何指向已删除元素的迭代器都具有无效值,毕竟,该迭代器指
向了容器中不再存在的元素。
 
使用迭代器编写程序时,必须留意哪些操作会使迭代器失效。
使用无效迭代器将会导致严重的运行时错误。


c.rbegin()  返回一个逆序迭代器,它指向容器 c 的最后一个元素
c.rend()  返回一个逆序迭代器,它指向容器 c 的第一个元素前面的位置
 
所有顺序容器都支持 push_back 操作


容器元素都是副本


在容器中添加元素时,系统是将元素值复制到容器里。类似地,使用一
段元素初始化新容器时,新容器存放的是原始元素的副本。被复制的原
始值与新容器中的元素各不相关,此后,容器内元素值发生变化时,被
复制的原值不会受到影响,反之亦然。
 
添加元素可能会使迭代器失效


任何 insert 或 push 操作都可能导致迭代器失效。当编写循
环将元素插入到 vector 或 deque 容器中时,程序必须确保迭
代器在每次循环后都得到更新。


避免存储  end   操作返回的迭代器


在 vector 或 deque 容器中添加元素时,可能会导致某些或全部迭代器失
效。假设所有迭代器失效是最安全的做法。这个建议特别适用于由 end 操作返
回的迭代器。在容器的任何位置插入任何元素都会使该迭代器失效。


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


Exercise
9.18:
编写程序将 int 型的 list 容器的所有元素复制到两个
deque 容器中。list 容器的元素如果为偶数,则复制到
一个 deque 容器中;如果为奇数,则复制到另一个 deque
容器里。


view plain
#include<iostream> 
#include<list> 
#include<vector> 
#include<deque> 
using namespace std; 
 
void print(list<int>::iterator beg,list<int>::iterator end) 

     while(beg!=end) 
     { 
             cout<<*beg<<" "; 
             beg++;                
     }      
     cout<<endl; 

 
void print(deque<int>::iterator beg,deque<int>::iterator end) 

     while(beg!=end) 
     { 
             cout<<*beg<<" "; 
             beg++;                
     }      
     cout<<endl; 

 
int main() 

    list<int>lst;  
    deque<int>odd,even; 
    int range=20; 
    for(int i=0;i<range;i++) 
            lst.push_back(i); 
    print(lst.begin(),lst.end()); 
    list<int>::iterator itl=lst.begin(); 
    while(itl!=lst.end()) 
    { 
         if(*itl%2==0) 
                 even.push_back(*itl); 
         else 
                 odd.push_back(*itl);        
      &n

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,