C++容器类用法

容器的概述

容器的定义

在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法。

容器的种类

1、顺序容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。顺序容器包括:vector(向量)、list(列表)、deque(队列)。

2、关联容器:关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。元素是有序的集合,默认在插入的时候按升序排列。关联容器包括:map(集合)、set(映射)、multimap(多重集合)、multiset(多重映射)。

3、容器适配器:本质上,适配器是使一种不同的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。适配器是容器的接口,它本身不能直接保存元素,它保存元素的机制是调用另一种顺序容器去实现,即可以把适配器看作“它保存一个容器,这个容器再保存所有元素”。STL 中包含三种适配器:栈stack 、队列queue 和优先级队列priority_queue 。

容器类自动申请和释放内存,因此无需new和delete操作。

常用容器用法介绍

vector

常用操作函数

1.构造函数
vector():创建一个空vector
vector(int nSize):创建一个vector,元素个数为nSize
vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
vector(const vector&):复制构造函数
vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中

2.增加函数
void push_back(const T& x):向量尾部增加一个元素X
iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

3.删除函数
iterator erase(iterator it):删除向量中迭代器指向元素
iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
void pop_back():删除向量中最后一个元素
void clear():清空向量中所有元素

4.遍历函数
reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素之前的位置

5.判断函数
bool empty() const:判断向量是否为空,若为空,则向量中无元素

6.大小函数
int size() const:返回向量中元素的个数
int capacity() const:返回当前向量所能容纳的最大元素值
int max_size() const:返回最大可允许的vector元素数量值

7.其他函数
void swap(vector&):交换两个同类型向量的数据
void assign(int n,const T& x):设置向量中第n个元素的值为x
void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

简单介绍

Vector<类型>标识符
Vector<类型>标识符(最大容量)
Vector<类型>标识符(最大容量,初始所有值)
Int i[5]={1,2,3,4,5}
Vector<类型>vi(I,i+2);//得到i索引值为3以后的值
Vector< vector< int> >v; 二维向量//这里最外的<>要有空格。否则在比较旧的编译器下无法通过

实例

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef vector<int> VECTOR;

void show_print(VECTOR vec) 
{
​    VECTOR::iterator it = vec.begin();
​    for(; it != vec.end(); it++)
​    {
​         cout << *it << " ";
​    }
​    cout << endl;
}

bool compare(int a, int b)
{
​    return a > b;
}

int main()
{
​    vector<int> vec1;
​    for(int i = 0; i < 10; i++)
​    {
​         vec1.push_back(i);  //在数组后面添加元素 
​         cout << vec1[i] << " ";
​    }

​    for(int i = 0; i < 5; i++)
​    {
​         vec1.pop_back();  //去掉数组最后一个元素 
​    }

​    cout << endl;
​    for(int i = 0; i < vec1.size(); i++)  //数组个数 
​    {
​         cout << vec1[i] << " ";
​    }

​    cout << endl;

​    vec1.clear();    //清除数组内的所有元素 
​    for(int i = 0; i < vec1.size(); i++)
​    {
​         cout << vec1[i] << " "; //下标法遍历 
​    }

​    cout << endl;

​    vec1.push_back(2);
​    vec1.push_back(4);
​    vec1.insert(vec1.begin(),2,5);  //插入元素 
​    vector<int>::const_iterator it2 = vec1.begin();
​    for(; it2 != vec1.end(); it2++)
​    {
​         cout << *it2 << " ";   //迭代器法遍历 
​    }
​    cout << endl;

​    vec1.erase(vec1.begin());
​    sort(vec1.begin(), vec1.end());  //升序 
​    show_print(vec1);
​    cout << endl ;

​    sort(vec1.begin(), vec1.end(), compare); //降序 
​    show_print(vec1);
​    cout << endl;

​    reverse(vec1.begin(), vec1.end()); //反向 
​    show_print(vec1);

​    return 0;
}

输出:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4

5 5 2 4
2 4 5

5 4 2
2 4 5

二维数组两种定义方法(结果一样)

实例:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
​    int N1 = 2, M1 = 3;     //方法一 
​    int N2 = 3, M2 = 2; 
​    vector<vector<int> > vec1(N1);  //定义动态二维数组5行 
​    for(int i = 0; i < vec1.size(); i++) //动态二位数组5行6列,值全为0 
​    {
​         vec1[i].resize(M1);
​    }

​    for(int i = 0; i < vec1.size(); i++)
​    {
​         for(int j = 0; j < vec1[i].size(); j++)
​         {
​             cout << vec1[i][j] << " ";
​         }
​         cout << endl;
​    }

​    vector<vector<int> > vec2(N2, vector<int>(M2));
​    for(int i = 0; i < vec2.size(); i++)
​    {
​         for(int j = 0; j < vec2[i].size(); j++)
​         {
​             cout << vec2[i][j] << " ";
​         }
​         cout << endl;
​    } 

​    return 0;
}

输出:

0 0 0
0 0 0
0 0
0 0
0 0

deque

deque定义和初始化

所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速。而在中间插入元素则会比较费时,因为必须移动中间其他的元素。双端队列是一种随机访问的数据类型,提供了在序列两端快速插入和删除操作的功能,它可以在需要的时候改变自身大小,完成了标准的C++数据结构中队列的所有功能。

Vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。deque对象在队列的两端放置元素和删除元素是高效的,而向量vector只是在插入序列的末尾时操作才是高效的。deque和vector的最大差异,一在于deque允许于常数时间内对头端进行元素的插入或移除操作,二在于deque没有所谓的capacity观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。换句话说,像vector那样“因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque中是不会发生的。也因此,deque没有必要提供所谓的空间预留(reserved)功能。

虽然deque也提供Random Access Iterator,但它的迭代器并不是普通指针,其复杂度和vector不可同日而语,这当然涉及到各个运算层面。因此,除非必要,我们应尽可能选择使用vector而非deque。对deque进行的排序操作,为了最高效率,可将deque先完整复制到一个vector身上,将vector排序后(利用STL的sort算法),再复制回deque。

deque是一种优化了的对序列两端元素进行添加和删除操作的基本序列容器。通常由一些独立的区块组成,第一区块朝某方向扩展,最后一个区块朝另一方向扩展。它允许较为快速地随机访问但它不像vector一样把所有对象保存在一个连续的内存块,而是多个连续的内存块。并且在一个映射结构中保存对这些块以及顺序的跟踪。

deque deq; // 声明一个元素类型为type的双端队列que
deque deq(

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值