C++ STL 常用容器


STL容器

STL的常用容器,分别是:
#1 vector list deque multiset unordered_multiset
#2 array hashtable tuple
在这里插入图片描述


vector<T>

定义:template < class T, class Alloc = allocator > class vector;

基本概念
vector(向量)是一个封装了大小和类型的动态容器,其本质和数组差不多;
vector的数据存储是一维的,默认每次扩容一倍;
正常使用情况,尽量指定容器的大小,对内存和速度有优化
在这里插入图片描述
常用API

// --------ctor---------
vector<int> v1 = { 3, 4, 5, 7, 9 };  //            使用initializer_list来构造一个vector
vector<int> v2 ();                   //            空构造函数
vector<int> v3 (v1);                 //            复制构造函数
vector<int> v4 (3);            //            指定容器的数量
vector<int> v5 (3, 0);     //            指定容器的数量并且全部初始化一个默认值
vector<int> v6 (v1.begin(), v1.end());//使用另外一个容器的fist和last迭代器指针来构造

// ---------add----------
v1.push_back(11); // 往容器的最后添加一个数据
v1.insert(v1.begin(), 1);// 在容器的指定位置添加一个数据

// ---------remove----------
v1.erase(v1.begin()); // 在容器的指定位置删除一个数据
v1.pop_back(); // 取出容器的最后一个数据,容器数据会删除
v1.clear(); // 清除容器的全部数据

// ---------capacity---------
v1.size(); // 容器当前的数据数量
v1.capacity(); // 容器当前开辟的内存空间数量
v1.max_size(); // 容器最大可以存储的数据量

v1.empty(); // 判断容器里面是否有数据

// ---------update----------
v1.swap(v6); // 交换同类型2个容器的数据
v1[0] = -3; // 更新指定位置数据的值

list<T>

定义:template < class T, class Alloc = allocator > class list;

基本概念
list是环状双向链表,可以在数据的两端对数据进行操作;
list无法通过下标定位数据,每次都要从0个元素开遍历数据;
正常使用情况,尽量指定容器的大小,对内存和速度有优化
在这里插入图片描述
常用API

list<int> link1 = { 3, 4, 5, 6, 7, 8 };
list<int> link2 ();
list<int> link3(link1);
list<int> link4(3);
list<int> link5(3, 4);
list<int> link6(link1.begin(), link1.end());

// ---------add---------
link1.push_back(9);
link1.push_front(2);
link1.insert(link1.begin(), 1);

// ---------remove---------
link1.pop_front();
link1.pop_back();
// link1.clear();
link1.erase(link1.begin());

// ---------update----------
link1.emplace_front(2);
link1.emplace_back(9);
link1.assign({1, 2, 3});
link1.swap(link6);

// ---------query-----------
link1.begin();
link1.end();

在这里插入图片描述


deque<T>

deque是不规则的顺序队列,可以从数据两边分别展开,拥有一段数据的约束范围
在这里插入图片描述
常用API

deque<int> queue1 = { 3, 4, 5, 6, 7 };
deque<int> queue2 ();
deque<int> queue3(queue1);
deque<int> queue4(3);
deque<int> queue5(3, 4);
deque<int> queue6(queue1.begin(), queue1.end());

// --------add--------
queue1.push_back(8);
queue1.insert(queue1.begin(), 2);

// --------remove--------
queue1.pop_back();
queue1.pop_front();
queue1.erase(queue1.begin());
// queue1.clear();

// --------update--------
queue1.assign({ 1, 2, 3 });
queue1.swap(queue6);
queue1.emplace_back(8);
queue1.emplace_front(2);

// --------query--------
queue1.at(0);
queue1[0];
queue1.front();
queue1.back();

在这里插入图片描述


multiset<T>

树状结构数据,和二叉树的数据结构差不多,可以允许元素重复;
在这里插入图片描述
常用API

multiset<int> tree1 = { 3, 4, 5, 6, 7 };
multiset<int> tree2 ();
multiset<int> tree3 (tree1);
multiset<int> tree4 (tree1.begin(), tree1.end());

// --------add--------
tree1.insert(tree1.begin(), 2);
tree1.emplace(8);

// --------remove--------
tree1.erase(tree1.begin());
// tree1.clear()

// --------update--------
tree1.swap(tree4);

// --------query--------
tree1.find(4);

在这里插入图片描述


unordered_multiset<T>

无序多集数据链表,效率比multiset高
在这里插入图片描述


常用API
在这里插入图片描述


array<T, size>

array是固定数量大小的顺序数组,是基于原始数据的第一层封装

int main(int argc, char* argv[])
{
	// 固定数量大小,不足位补零
	array<int, 6> arr1 = {3,4, 5, 6, 7};

	// 将数据全部定义成8
	arr1.assign(8);

	arr1.front();
	arr1.back();

	arr1.at(0);
	arr1[0];
}

在这里插入图片描述


hashtable<T>

hash表,也是散列表,对于数据拥有不确定性,写入慢,读取快
工作原理:先开辟一个数量的内存空间,如果数据的占据空间大于开辟的内存空间,
则进行rehashing来扩容。

C++2.0无序容器
在这里插入图片描述

unordered_set<int> us1 = { 3, 4, 5, 6, 7 };
unordered_multiset<int> um1 = { 3, 4, 5, 6, 7 };
unordered_map<int, string>  um2 = { { 1, "one" }, { 2, "two" }, { 3, "three"} };
unordered_multimap<int, string> um3 = { { 1, "one" }, { 2, "two" }, { 3, "thred" } };
cout << um2[1] << endl;
cout << um3.begin()->first << um3.begin()->second << endl;

tuple<T>

tuple元组可以最多指定数量为15个元素

常用API

tuple<int, string, float> t1(1, "one", 3.14 );
auto t2 = make_tuple(2, "two", 3.14);

string t1t = get<1>(t1);
string t2t = get<1>(t2);
cout << t1t << " " << t2t << endl;

// 将tuple对应类型的数据赋值到声明的变量上
int ai;
const char* ac;
double ad;
tie(ai, ac, ad) = t2;
cout << ac <<  endl;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值