C++ 标准模板库STL的数据结构

来源:互联网 发布:淘宝换购拍下 编辑:程序博客网 时间:2024/06/06 00:06

很多时候要用数据结构的时候,不能很好的利用标准库中已有的结构。感觉又浪费时间 又不讨好,主要还是对基本的数据结构的理解和使用不熟悉。这里总结一下C++ STL中的数据结构。

STL中数据结构以 STL容器(Container)的形式提供,
主要包括序列式容器和关联式容器。


vector

动态数组

vector
#include

1.定义和初始化

vector<int> vec1;    //默认初始化,vec1为空vector<int> vec2(vec1);  //使用vec1初始化vec2vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2vector<int> vec4(10);    //10个值为的元素vector<int> vec5(10,4);  //10个值为的元素

2.常用操作方法

vec1.push_back(100);            //添加元素int size = vec1.size();         //元素个数bool isEmpty = vec1.empty();    //判断是否为空cout<<vec1[0]<<endl;        //取得第一个元素vec1.insert(vec1.end(),5,3);    //从vec1.back位置插入个值为的元素vec1.pop_back();              //删除末尾元素vec1.erase(vec1.begin(),vec1.end());//删除之间的元素,其他元素前移cout<<(vec1==vec2)?true:false;  //判断是否相等==、!=、>=、<=...vector<int>::iterator iter = vec1.begin();    //获取迭代器首地址vector<int>::const_iterator c_iter = vec1.begin();   //获取const类型迭代器vec1.clear();                 //清空元素
  • vector支持随机存取
  • vector的大小(size)和容量(capacity)通常是不同的,capacity返回vector实际能容纳的元素数量。如果超过这个数量需要重新配置内部存储器。

3.遍历

//下标法 不对i进行越界检查int length = vec1.size();for(int i=0;i<length;i++){   cout<<vec1[i]; }//at  会对i进行越界检查vec1.at(i);//迭代器法vector<int>::const_iterator iterator = vec1.begin();for(;iterator != vec1.end();iterator++){   cout<<*iterator;}

array

参考:http://blog.csdn.net/senlinzm/article/details/38682233

array是一个固定大小的顺序容器,不能动态改变大小,array内的元素在内存中以严格的线性顺序存储,连续内存存放。

区别于 数组:

与普通数组声明存储空间大小[]的方式是一样有效的,只是加入了一些成员函数和全局函数[get (array)、operators (array)],以便当作标准容器使用。

赋值:array 可以将一个 array 对象直接赋值给另一个相同类型和大小的 array 对象,array 中的元素将会依次进行复制,

区别于 vector:

不同于 vector,array 定义的时候必须定义数组的元素个数,且定义后空间的大小就确定不能改变了。array 执行效率比 vector 高,

#include <array>

定义和初始化

array<int, 5> arr;         // arr中元素的值是未定义的  array<int, 5> arr1 = { 1, 2, 3, 4, 5 };          // arr1包含:1 2 3 4 5    array<int, 5> arr2 = { 0 };                      // arr2包含:0 0 0 0 0  

常用操作方法

赋值 相同类型和大小的array

array<int, 5> arr1 = { 1, 2, 3, 4, 5 };  array<int, 5> arr2 = { 5, 4, 3, 2, 1 };  array<int, 5> arr3 = arr1;                  // arr3 包含:1 2 3 4 5  arr3 = arr2;                                // arr3 包含:5 4 3 2 1   

注意,仅能将一个相同类型的array赋值给另一个array,但不能使用初始化列表来赋值array对象:

array<int, 5> arr1 = { 1, 2, 3, 4, 5 };  // ERROR: arr1 = { 1, 2, 3 };        不能使用初始化列表来向array赋值  

fill()

array<int, 5> arr;  arr.fill( 9 );                // arr包含: 9 9 9 9 9  

swap :需要一个一个复制

array<int, 5> arr1 = { 1, 2, 3, 4, 5 };  array<int, 5> arr2 = { 5, 4, 3, 2, 1 };  swap( arr1, arr2 );  arr1.swap( arr2 );          

遍历

array<int, 5> arr = { 1, 2, 3, 4, 5 };  for ( int i = 0; i != arr.size() ; ++i )  {      cout << arr[i] << " ";  }  

list

双向循环链表
list

#include <list>  

Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.
list不支持随机存取,因此不提供下标操作符
在任何位置上执行元素的安插和移除都非常快。

1.定义和初始化

list<int> lst1;          //创建空listlist<int> lst2(3);       //创建含有三个元素的listlist<int> lst3(3,2);        //创建含有三个元素的listlist<int> lst4(lst2);       //使用lst2初始化lst4list<int> lst5(lst2.begin(),lst2.end());  //同lst4

2.常用操作方法

lst1.assign(lst2.begin(),lst2.end());  //分配值lst1.push_back(10);                    //添加值lst1.pop_back();                   //删除末尾值lst1.begin();                      //返回首值的迭代器lst1.end();                            //返回尾值的迭代器lst1.clear();                          //清空值bool isEmpty1 = lst1.empty();          //判断为空lst1.erase(lst1.begin(),lst1.end());   //删除元素lst1.front();                      //返回第一个元素的引用lst1.back();                       //返回最后一个元素的引用lst1.insert(lst1.begin(),3,2);     //从指定位置插入个lst1.rbegin();                     //返回第一个元素的前向指针lst1.remove(2);                    //相同的元素全部删除lst1.reverse();                    //反转lst1.size();                       //含有元素个数lst1.sort();                       //排序lst1.unique();                     //删除相邻重复元素

3.遍历

//迭代器法list<int>::const_iterator iter;for(iter = lst1.begin(); iter !=lst1.end();iter++){       cout<<*iter;}

deque

#include <deque>

deque

deque是一种优化了的对序列两端元素进行添加和删除操作的基本序列容器。
两级数组结构:1. 实际容器 2. 指向容器首尾的指针。
通常由一些独立的区块组成,第一区块朝某方向扩展,最后一个区块朝另一方向扩展。它允许较为快速地随机访问但它不像vector一样把所有对象保存在一个连续的内存块,而是多个连续的内存块。

和vector之间的区别与联系

与 vector 类似,但对首元素的有效插入和删除提供支持。deque在随机访问和遍历数据会比vector慢。

vector 的基本操作支持 deque.deque的各项操作只有一下两点和vector不同:

  • deque不提供容量操作:capacity()和reverse()。
  • deque直接提供函数完成首尾元素的插入和删除

http://blog.csdn.net/xiajun07061225/article/details/7442816


stack

后进先出(LIFO)

#include <stack>

核心接口

push()-将元素压栈
top()-返回栈顶元素,但不移除
pop()-从栈中移除栈顶元素,但不返回


queue

先进先出(FIFO)

#include <queue>

核心接口

push()-将元素置入队列
front()-返回队列头部元素,但不移除
back()-返回队列尾部元素,但不移除
pop()-从栈中移除元素,但不返回


http://blog.chinaunix.net/uid-24219701-id-2181266.html

C++ STL中的数据结构和算法
http://blog.csdn.net/strint/article/details/45308001

http://blog.csdn.net/conanswp/article/details/23297441

原创粉丝点击