顺序容器

一、顺序容器的相关操作:

示例:

 1 #include <iostream>
 2 #include <vector>
 3 #include <list>
 4 #include <deque>
 5
 6 using namespace std;
 7 int main()
 8 {
 9     vector<int> a;
10     list<int>   b;
11     deque<int>  c;
12
13     vector<int>::size_type      a1;
14     vector<int>::iterator       a2;
15     vector<int>::const_iterator a3;
16     vector<int>::reverse_iterator a4;
17     vector<int>::const_reverse_iterator a5;
18     vector<int>::difference_type a6;
19     vector<int>::value_type      a7;
20     vector<int>::reference       a8;
21     vector<int>::const_reference a9;
22
23     list<int>::size_type        b1;
24     list<int>::iterator         b2;
25     list<int>::const_iterator   b3;
26     list<int>::reverse_iterator b4;
27     list<int>::reverse_iterator b4;
28     list<int>::const_reverse_iterator b5;
29     list<int>::difference_type b6;
30     list<int>::value_type      b7;
31     list<int>::reference       b8;
32     list<int>::const_reference b9;
33
34     deque<int>::size_type       c1;
35     deque<int>::iterator            c2;
36     deque<int>::const_iterator   c3;
37     deque<int>::reverse_iterator c4;
38     deque<int>::const_reverse_iterator c5;
39     deque<int>::difference_type c6;
40     deque<int>::value_type      c7;
41     deque<int>::reference       c8;
42     deque<int>::const_reference c9;
43
44     a.push_back(10);
45     a.push_back(20);
46     a.push_back(30);
47     a.push_back(40);
48     for(vector<int>::size_type i=0; i<a.size();++i){
49         cout << a[i] << endl;
50     }
51     c.push_back(10);
52     c.push_back(20);
53     c.push_back(30);
54     for(deque<int>::size_type ii=0; ii<c.size();++i){  //size_type,而不是用int类型
55         cout << c[ii] << endl;
56     }
57
58     for(deque<int>::reverse_iterator iii=c.rbegin();  //反向迭代器
59         iii != c.rend();iii--)
60     {
61     }
62     return 0;
63 }

 二、顺序容器的拆入操作:

  1、容器元素中拆入的都是副本,不会影响原数据;

  2、插入操作可能会使得迭代器失效;

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

迭代器失效示例代码: 1 vector<int> ivec;
 2 ivec.push_back(10):
 3 ivec.push_back(20):
 4 ivec.push_back(30):
 5 ivec.push_back(40):
 6
 7 vector<int>::iterator first = ivec.begin()++;
 8 vector<int>::iterator last= ivec.end();
 9
10 while(first != last){    //error,  ok:while(first != ivec.end(){11     first = ivec.insert(first, 42);
12     ++first;
13 }

顺序容器拆入操作示例代码:

#include <iostream>
#include <vector>
#include <list>     //链表
#include <deque>    //双端数组
#include <string>

using namespace std;

int main()
{
    vector<string> svec;
    list<string>   slist;
    deque<string>  sdeque;

    //末端拆入
    svec.push_back("Bill");
    svec.push_back("Tom");
    svec.push_back("Mary");

    slist.push_back("Bill");
    slist.push_back("Tom");
    slist.push_back("Mary");

    sdeque.push_back("Bill");
    sdeque.push_back("Tom");
    sdeque.push_back("Mary");

    //前端拆入,向量vector没有push_front
    slist.push_front("111");
    slist.push_front("222");
    slist.push_front("333");

    sdeque.push_front("111");
    sdeque.push_front("222");
    sdeque.push_front("333");

    for(std::vector<string>::iterator it=svec.begin(); it!=svec.end(); ++it){
        cout << *it <<" ";
    }
    cout << std::endl;

    std::vector<string>::iterator it=svec.begin();
    it++;
    svec.insert(it, "Hello");
    svec.insert(it, 10, "Hello");
    for(std::vector<string>::iterator it=svec.begin(); it!=svec.end(); ++it){
        cout << *it <<" ";
    }
    cout << std::endl;

    string arr_str[] = {"hello", "8999", "888", "3444"};
    it=svec.begin();
    it++;
    svec.insert(it, arr_str+1, arr_str+3);
    for(std::vector<string>::iterator it=svec.begin(); it!=svec.end(); ++it){
        cout << *it <<" ";
    }
    cout << std::endl;、

    return 0;
}        

二、 顺序容器的关系运算符:

   1、比较的容器必须具有相同的容器类型;

   2、容器的比较是基于容器内元素的比较;

   3、容器内元素必须有相应的关系运算符;(对象的话,必须在类中实现>, < 等符号的重载);

 2 #include <iostream>
 3 #include <vector>
 4
 5 class Dog
 6 {
 7     //成员省略
 8     //必须>, >=, <, <=, ==, !=
 9 };
10
11 int main()
12 {
13     vector<int> ivec1;
14     vector<int> ivec2;
15     vector<int> ivec3;
16     vector<int> ivec4;
17     vector<int> ivec5;
18
19     ivec1.push_back(1);
20     ivec1.push_back(3);
21     ivec1.push_back(5);
22     ivec1.push_back(7);
23     ivec1.push_back(9);
24     ivec1.push_back(12);
25
26     ivec1.push_back(0);
27     ivec1.push_back(2);
28     ivec1.push_back(4);
29     ivec1.push_back(6);
30     ivec1.push_back(8);
31     ivec1.push_back(11);
32
33     /*  同类型之间进行比较
34      *  两个向量比较大小,如果向量中每个数都相等(个数要相等),这个两个向量才相等,否则不等;则从第一个依次开始比较,遇到不等则区分大小;
35      */
36     if(ivec1 > ivec2)
37     {
38         cout << "ivec1 大!"<< endl;
39     }
40     ivec4.push_back(1);
41     ivec4.push_back(3);
42     ivec4.push_back(5);
43     ivec1.push_back(7);
44
45     vector<Dog> dogA;
46     vector<Dog> dogB;       //对象中必须重载关系运算符
47     dogA.push()
48
49     return 0;
50 }

四、容器大小的操作:

   1、c.size();

   2、c.max_size();

   3、c.empty();

   4、c.resize(n);

   5、c.resize(n, t);

  注意:resize操作可能会使迭代器失效

 2 #include <iostream>
 3 #include <vector>
 4 #include <list>
 5 #include <deque>
 6
 7 using namespace std;
 8 int main()
 9 {
10     list<int> ilist;
11     ilist.push_back(10);
12     ilist.push_back(20);
13     ilist.push_back(30);
14
15     cout <<"容器里数据的个数:" << ilist.size();
16
17     list<int>::size_type count = ilist.size();
18     cout <<"容器里数据的个数:" << ilist.size();
19
20     cout <<"容器的max_size:" << ilist.max_size();
21     if(ilist.empty()){
22         cout << "容器是空的" ;
23     }else{
24         cout << "容器是空的" ;
25     }
26
27     ilist.resize(10);       //增加了元素默认值为0;
28     for(list<int>::iterator it=ilist.begin(); it!=ilist.end();++it){
29         cout << *it << std::endl;
30     }
31     ilist.resize(20, -1);   //新增的值为-1
32     for(list<int>::iterator it=ilist.begin(); it!=ilist.end();++it){
33         cout << *it << std::endl;
34     }
35
36     //ilist.resize(0);      //清空容器
37     ilist.resize(10);       //缩小容器,删除了元素;
38     for(list<int>::iterator it=ilist.begin(); it!=ilist.end();++it){
39         cout << *it << std::endl;
40     }
41     return 0;
42 }

五、访问容器中的元素

  c.back();

  c.front();

  c[n];    //仅适用于vector, deque

  c.at(n);   //仅适用于vector, deque

 1 #include <list>
 2 #include <vector>
 3 #include <deque>
 4 #include <stdexcept>      //捕获异常时候,必须包含的文件
 5
 6 using namespace std;
 7 int main()
 8 {
 9     vector<int> ivec;
10     ivec.push_back(10);
11     ivec.push_back(20);
12     ivec.push_back(30);
13
14     cout << ivec.front() << endl;
15     cout << ivec.back()  << endl;
16     vector<int>::reference a = ivec.front();
17     vector<int>::reference b = ivec.back(); //返回值为容器内元素的引用类型
18
19     cout << a << endl;
20     cout << b  << endl;
21
22     cout << *ivec.begin() << endl;              //通过迭代器获取数据
23     b = *ivec.begin();                          //begin()返回值为迭代器,即指针
24     cout << b  << endl;
25
26     cout << ivec[0] <<endl;     //只能vecto    cout << ivec[1] <<endl;
27     cout << ivec[2] <<endl;
28     //cout << ivec[3] <<endl;           //内存泄漏,不会抛出异常
29
30     cout << ivec.at(0) <<endl;  //同样只能用于vector、deque
31     cout << ivec.at(1) <<endl;
32     cout << ivec.at(2) <<endl;
33     //cout << ivec.at(3) <<endl;            //at()会抛出异常
34
35     try{
36         cout <<ivec.at(3) <<endl;
37     }catch(out_of_range){
38         cout <<"ivec out of range"<< endl;
39     }
40
41
42     list<int> ilist;
43     ilist.push_back(200);
44     if(!ilist.empty()){
45             cout << ilist.front() << endl;  //先判断容器是否为 空
46             cout << ilist.back() << endl;
47     }
48
49     //cout << ilist[0] <<endl;      //error,list链表不能使用下标
50     return 0;
51 }
52  

六、顺序容器的删除操作

  删除元素:

    c.erase(p);

    c.erase(b, e);    //删除区间为左闭右开区间,即b删除,e不删除

    c.clear();

    c.pop_back();    //从后面取走元素

    c.pop_front();    //从前面取走元素,不适用于vector,list,deque容器适用;

七、顺序容器的操作

  赋值与交换

    c1 = c2    //将容器c2中的数据拷贝到c1容器中:

    c1.swap(c2)  //将容器c2中的数据相互交换c1的数据

    c.assign(b, e) //赋值 

    c.assign(n, t)   //赋值

  使用assign:类型兼容即可

  使用swap: 类型必须相同

 2 #include <iostream>
 3 #include <list>
 4 #include <deque>
 5 #include <vector>
 6 #include <string>
 7
 8 using namespace std;
 9 int main()
10 {
11     vector<int> a;
12     vector<int> b;
13     vector<int> c;
14     vector<char *> svec;
15     list<string> slist;
16
17     a.push_back(10);
18     a.push_back(20);
19     a.push_back(30);
20     a.push_back(40);
21
22     b.push_back(100);
23     b.push_back(200);
24     b.push_back(300);
25
26     c.push_back(1000);
27     c.push_back(2000);
28     c.push_back(3000);
29     c.push_back(4000);
30     c.push_back(5000);
31     c.push_back(6000);
32
33
34     a.swap(b);
35     for(vector<int>::iterator it = a.begin(); it!=a.end();it++){
36         cout << *it << endl;
37     }
38
39     a = b;
40     for(vector<int>::iterator it = a.begin(); it!=a.end();it++){
41         cout << *it << endl;
42     }
43
44     vector<int>::iterator f = c.begin();
45     vector<int>::iterator e = c.end();
46     f++;
47     f++;
48     e--;
49
50     a.assign(f, e);
51     for(vector<int>::iterator it = a.begin(); it!=a.end();it++){
52         cout << *it << endl;
53     }
54
55     svec.push_back("apple");
56     svec.push_back("big");
57     svec.push_back("cat");
58
59     slist.push_back("c");
60     slist.push_back("c++");
61     slist.push_back("java");
62     slist.push_back("c#");
63
64     slist.assign(svec.begin(), svec.end()); //将字符指针转成string
65     for(list<string>::iterator it1 = slist.begin(); it1!= slist.end();it1++){
66         cout << *it1<< endl;
67     }
68  slist.assign(10, "APP");    //将字符指针转成string
69     for(list<string>::iterator it1 = slist.begin(); it1!= slist.end();it1++){
70         cout << *it1<< endl;
71     }
72     return 0;
73 }

 

  

 

时间: 2024-10-31 14:47:28

顺序容器的相关文章

WF 4.0基础篇(四) 顺序容器Sequence与CodeActivity

本节主要介绍如何在WF4.0的流程中添加多个Activity,以及如何自定义Activity 本文例子下载: http://files.cnblogs.com/foundation/SequenceSample.rar http://files.cnblogs.com/foundation/CodeActivitySample.rar 顺序容器Sequence 与CodeActivity 顺序容器Sequence 类名 System.Activities.Statements.Sequence

[C++ 面试基础知识总结] 顺序容器

[C++ 面试基础知识总结] 顺序容器 参考书籍:<C++ Primer> 目录 C 面试基础知识总结 顺序容器 目录 顺序容器与选择 迭代器 容器的初始化和赋值 顺序容器操作 添加元素 访问元素 删除元素 改变容器大小 迭代器失效 vector对象的增长 string 操作 改变string 搜索string 数值转换 容器适配器 栈stack 队列queue 顺序容器与选择 顺序容器类型: vector 可变大小数组 deque 双端队列 list 双向链表 forward_list 单向

STL之顺序容器

顺序容器: vector:数组 list:链表 deque:双端数组 顺序容器适配器: stack:堆栈 queue:队列 priority_queue:优先级队列 deque是一个动态数组 deque与vector非常类似: deque可以在在数组开头和末尾插入和删除数据: 1 #include <deque> 2 #include <algorithm> 3 4 deque<int>::iterator iElemetnLocater; 5 for(iElement

STL之如何选择顺序容器

一.顺序容器的分类 顺序容器:vector向量.list链表.deque双端队列: 优先级最高的是vector向量,它的速度比较快,优点最多: 在程序设计中,容器可以切换: 1 #include <iostream> 2 #include <vector> 3 #include <list> 4 #include <deque> 5 6 using namespace std; 7 8 int main() 9 { 10 vector<int>

c++-C++中顺序容器 erase,C++ Primer是否出错

问题描述 C++中顺序容器 erase,C++ Primer是否出错 C++ Primer中文第五版9.3.3的P312删除多个元素原文: elem1=slist.erase(elem1,elem2); //调用后,elem1==elem2 迭代器elem1指向我们要删除的第一个元素,elem2指向我们要删除的最后一个元素之后的位置. 这句话是不是错了.调用slist.erase(elem1,elem2)删除了slist从elem1到elem2(包含elem2)的元素,指向elem2后的元素.那

C++Primer笔记之顺序容器的使用详解_C 语言

顺序容器,它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器.标准库里定义了三种类型:vector(支持快速随机访问).list(支持快速插入.删除).deque(双端队列)容器只定义了少量操作,大多数额外的操作由算法库提供.容器内元素的类型约束:1.元素类型必须支持赋值运算:2.元素类型的对象必须可以复制.这是容器元素类型的最低要求,如果想支持一些其他特殊要求,则必须具备相关的性质. 可以定义容器的容器vector< vector<int> > l

STL - 常用顺序容器代码

不多说,看代码 #include <iostream> #include <vector> #include <deque> #include <list> #include <forward_list> #include "ContainerTest.h" #include "ContainerUtil.h" using namespace std; void ContainerTest::run() {

Symbian手记【四】 —— Symbian的容器

CArray系列容器 Symbian的设计者,非常喜欢复杂的继承结构和保罗万象的类,CArray系列的容器,就是在这种理念下的产物.CArray是顺序容器,相当于STL的vector + list,以及更多. CArray系列容器,在继承的最底端,也就是可实例化使用的类,都采用CArrayXxxYxx的命名方式,即:CArray + 对象单元存储方式 + 对象段存储方式.所谓对象单元存储方式,就是表征容器中每一个单元数据,是如何存放的,在CArray中,主要有四种: Flat,容器中的每个数据,

ACM STL容器和算法

1.4      STL 的组成 STL有三大核心部分:容器(Container).算法(Algorithms).迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件.通俗的讲: 容器:装东西的东西,装水的杯子,装咸水的大海,装人的教室--STL里的容器是可容纳一些数据的模板类. 算法:就是往杯子里倒水,往大海里排污,从教室里撵人--STL里的算法,就是处理容器里面数据的方法.操作. 迭代器:往杯子里倒水的水壶,