STL基础(二)

来源:互联网 发布:cf免费卡枪带软件 编辑:程序博客网 时间:2024/06/05 03:46
  • 容器:
    用来管理一组元素。
    这里写图片描述

序列式容器:
vector
将元素置于一个动态数组中加以管理。
可以随机存取元素,用索引直接存取。
数组尾部添加或移除元素非常快,但是在中部或头部安插元素比较费时。

    // this is the part of vector    int a[5] = {1,2,3,4,5};    vector<int> coll(a,a+5);    for (int i=6;i<=10;i++)    {        coll.push_back(i);    }    for (int i=0;i<coll.size();i++)    {        cout<<coll[i]<<"   ";    }

deque
是”double-ended queue”的缩写
可以随机存取元素(用索引直接存取)
数组头部和尾部添加或移除元素都非常快,但在中部安插元素比较费时。

    deque<float> deques;    for (int i = 1;i<=6;i++)    {        deques.push_front(i*1.1);    }    for (int i=0;i<deques.size();i++)    {        cout<<deques[i]<<"   ";    }

List双向链表
不提供随机存取,按顺序走到需存取的元素。O(n)
在任何位置上执行插入或删除动作都非常迅速,内部只需要调整一下指针。

    list<char> lists;    for (char c = 'a';c<='z';c++)    {        lists.push_back(c);    }    while(lists.empty()==false)    {        cout<<lists.front();        lists.pop_front();    }

迭代器(Iterator)
这里写图片描述
通过迭代器,我们可以使用相同的方式来访问,遍历容器。
使用方法如下:

int ai[5] = {1,2,3,4,5};vector<int> ivec(ai,ai+5);vector<int>::iterator iter;for(iter = ivec.begin();iter!=ivec.end();++iter)        cout<<*iter<<"  ";

每种容器都必须提供自己的迭代器。
迭代器的概念:
1. 迭代器是一个“可遍历STL容器内全部或部分元素”的对象
2. 一个迭代器指出容器中的一个特定位置。
3. 具有遍历复杂数据结构的能力。

迭代器的基本操作有:
- Operator* :返回当前位置上的元素值,如果该元素拥有成员,你可以通过迭代器,直接使用operator->取用他们。
- Operator++,将迭代器前进至下一个元素,大多数迭代器还可以使用operator–,退回到前一个元素。
- operator==和operator!=
判断两个迭代器是否指向同一位置。
- operator=
为迭代器赋值。

class Student{public:    int no;    string name;    Student(int no,string name)    {        this->no = no;        this->name = name;    }};int _tmain(int argc, _TCHAR* argv[]){    list<Student> lists;    for (int i =0;i<10;i++)    {           char name[20];        sprintf_s(name,"csl%d",i+1);        Student stu(i+1,name);        lists.push_back(stu);    }    list<Student>::iterator iter;    for (iter=lists.begin();iter!=lists.end();++iter)    {        cout<<(*iter).name<<"---"<<iter->name<<endl;        iter->no = iter->no *2;    }    for (iter=lists.begin();iter!=lists.end();++iter)    {        cout<<(*iter).no<<"---"<<iter->no<<endl;    }    getchar();    return 0;}

需要说明两点:第一:当迭代器拥有的元素有成员时,可以使用operator->直接取用或者调用。
第二:当需要将实数与字符串进行拼接的时候,可以使用如下的方式:
char name[20];
sprintf_s(name,”csl%d”,i+1);

char * 转string是可以直接进行转换的。

  • 关联式容器
    Sets/Multisets
    内部的元素依据其值自动排序。
    Set内相同数值的元素只能出现一次,Multiset内可包含多个数值相同的元素,内部由二叉树实现(具体来说,就是红黑树),便于查找。
typedef set<int> IntSet;    set<int> coll;    coll.insert(1);//没有push_back。因为他是自动排序的    coll.insert(6);    coll.insert(2);    coll.insert(4);    coll.insert(3);    coll.insert(6);    IntSet::const_iterator pos;    for (pos=coll.begin();pos!=coll.end();++pos)    {        cout<<*pos<<"  ";//迭代器输出的时候是有序遍历的    }

输出结果为: 1 2 3 4 6

Maps/Multimaps
Map的元素是成对的键值对,内部的元素依据其值自动排序。
map内相同数值的元素只能出现一次,multimap内可包含多个数值相同的元素。
内部由二叉树实现。便于查找。

容器的共通操作:
初始化:
list< int > l;
vector< int > ivec(l.begin(),l.end());
..
int array[]= {1,2,3,4};
set< int > iset(array,array+sizeof(array)/sizeof(array[0]));

0 0
原创粉丝点击