C++ STL容器

本文介绍了C++ STL(标准模板库)的基础知识,包括其作为C++标准库一部分的特点,以及主要容器如vector、deque、list、set、stack、queue、priority_queue的功能和常用操作。特别强调了不同容器在内存管理和操作效率上的区别,例如向量的动态数组特性,双端队列的两端插入删除优势,以及列表的快速插入删除但遍历较慢的特性。
摘要由CSDN通过智能技术生成

学习一下STL

STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。

C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表

STL模板库提供的容器有 string(字符串) set(集合) vector(向量)map(映射)deque(双端队列)list(列表)stack(栈)queue(队列)priority_queue(优先队列)

——当然了,这些都是看的资料上的一个一个学习的

1.string 字符串

#include<iostream>
#include<string>//string 函数的头文件
using namespace std;//前三行格式固定
string s;//定义一个字符串,可以任意输入
int main()
{
	cin >> s;
	cout << s << endl;
	return 0;
}

* getline(cin,s)就是一个整行输入

#include <iostream>
using namespace std;

int main()
{
    char str[100];
    cout << "输入一个字符串: ";
    cin.get(str, 100);

    cout << "您输入了: " << str << endl;
    return 0;
}

同时提一下,c++支持max、min、swap以及abs函数等,比如:

int c=max(5,7);
cout<<c<<endl;//endl是c++中的换行,好比c里面的'\n'
//然后就会输出7

int a,b;
cin>>a>>b;
swap(a,b);
cout<<a<<b<<endl;

2.vector向量

vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,是一个能够存放任意类型的动态数组,能够增加和压缩数据。同时向量可将元素存储在连续的内存位置中,并在运行时根据需要分配内存。

#include<iostream>
#include<vector>
using namespace std;

vector<string> v1;
int main()
{
    
    v1.push_back("woshiyigecaiji");
    v1.push_back(".com");
    for (vector<string>::iterator i = v1.begin(); i != v1.end(); ++i) //这里出现了一个迭代器,我弄不太明白,只能跟着写
    {
        cout << *i;//这里得用i的指针,应该是因为iterator的原因,我还是个菜鸡,只能硬记了
    }
    return 0;
}

c++向量函数(学几个最常用的)

back()         返回最后一个原始,不检查这个数据是否存在。 
front()         返回第一个元素。 
swap()         交换两个Vector。 
push_back()         在Vector最后添加一个元素。 
pop_back()         它从向量中删除最后一个元素。 
empty()         判断Vector是否为空(返回true时为空) 
insert()         它将在指定位置插入新元素。 
erase()         删除指定的元素。 
resize()         它修改向量的大小。 
clear()         它从向量中删除所有元素。 
size()         返回Vector元素数量的大小。 

3.deque双端队列

C ++双端队列

#include<iostream>
#include<deque>
using namespace std;

deque<int> s;
int main()
{
    s.push_front(1);
    s.push_front(2);
    s.push_front(3);
    for (deque<int>::iterator i = s.begin(); i != s.end(); ++i)//我好像知道这个所谓的迭代器大概是什么用途了,我要是想把输入的这几个数字再输出的话,可以套用这个把它们全部输出
    {
        cout << *i;//还是要注意,此处应该用*i
    }
    return 0;
}

c++双端队列函数(学几个最常用的)

assign() 它分配新内容并替换旧内容。 
emplace() 它将在指定位置添加一个新元素。 
emplace_back() 它在末尾添加一个新元素。 
emplace_front() 它在双端队列的开头添加一个新元素。 
insert() 它在指定位置之前添加一个新元素。 
push_back() 它在容器的末尾添加一个新元素。 
push_front() 它在容器的开头添加一个新元素。 
pop_back() 它从双端队列中删除最后一个元素。 
pop_front() 它从双端队列中删除第一个元素。 
swap() 它交换两个双端队列的内容。 
clear() 它将删除双端队列的所有内容。 
empty() 它检查容器是否为空。 
erase() 它删除元素。 
max_size() 它确定双端队列的最大大小。 
resize() 它改变了双端队列的大小。 
size() 它返回元素数。 

4.list列表

  • List是连续的容器,而vector是非连续的容器,即list将元素存储在连续的存储器中,而vector存储在不连续的存储器中。

  • 向量(vector)中间的插入和删除是非常昂贵的,因为它需要大量的时间来移动所有的元素。链表克服了这个问题,它是使用list容器实现的。

  • List支持双向,并为插入和删除操作提供了一种有效的方法。

  • 在列表中遍历速度很慢,因为列表元素是按顺序访问的,而vector支持随机访问。

#include<iostream>
#include<list>
using namespace std;
list<int> s{ 1,2,3,4 };
int main()
{
	cout << endl;
	return 0;
}

5.set(集合)

集合是存储排序键的关联容器,其中每个键都是唯一的,可以插入或删除但不能更改。

这里面东西太多了,明后天再详细学习

6.stack(栈)

这种数据结构使用LIFO技术,其中LIFO表示后进先出。首先插入的元素将在末尾提取,以此类推。有一个名为“top”的元素,它是位于最上面位置的元素。所有插入和删除操作都是在堆栈的顶部元素本身进行的。

常用的函数

empty  该函数用于测试堆栈是否为空。如果堆栈为空,则该函数返回true,否则返回false。 
size    该函数返回堆栈容器的大小,该大小是堆栈中存储的元素数量的度量。 
top     该函数用于访问堆栈的顶部元素。所有插入和删除操作都是在顶部元素上执行的。 
push   该函数用于在堆栈顶部插入新元素。 
pop      该函数用于删除元素,堆栈中的元素从顶部删除。 
emplace 该函数用于在当前顶部元素上方的堆栈中插入新元素。 
swap    该函数用于交换引用的两个容器的内容。 

#include <iostream>
#include <stack>
using namespace std;
void newstack(stack <int> s)
{
	stack <int> p = s;
	while (!p.empty())//只要不是空的,循环就继续
	{
		cout << '\t' << p.top();//换列输出,形式美观
		p.pop();
	}
	cout << '\n';
}
int main()
{
	stack <int> s;
	s.push(5);
	s.push(4);
	s.push(3);
	s.push(2);
	s.push(1);

	cout << "最新的堆栈是 : ";newstack(s);
	cout << "\n 长度 " << s.size();
	cout << "\n 优先级最高的是: " << s.top();
	cout << "\n 去除栈中第一个元素表示为: ";s.pop();
	newstack(s);
	return 0;
}

 7.queue(队列)

有一个称为“前”的元素,它是位于最前位置或位于第一个位置的元素,也有一个名为“后”的元素,它是位于最后位置的元素。在普通队列中,元素的插入在尾部,而删除则从前面开始。

常用函数

empty 该函数用于测试队列是否为空。如果队列为空,则该函数返回true,否则返回false。 
size 该函数返回队列中元素的个数。 
front 该函数返回第一个元素。元素起着非常重要的作用,因为所有的删除操作都是在front元素上执行的。 
back 该函数返回最后一个元素。该元素起着非常重要的作用,因为所有插入操作都在后面元素上执行。 
push 该函数用于在末尾插入一个新元素。 
pop 该函数用于删除第一个元素。 
emplace 该函数用于在当前后元素上方的队列中插入新元素。 
swap 该函数用于交换参考中两个容器的内容。 

#include <iostream>
#include<cstdio>
#include <queue>
#include <deque>
using namespace std;
queue<int> s;
void print(queue<int>s)
	{
		queue<int> v=s;//这个地方如果不加 =s 的话,队列输出会是无
		while (!v.empty())
		{
			cout << v.front();
			v.pop();
		}	
		cout << "\n";
	}
int main()
{
	s.push(5);
	s.push(4);
	s.push(3);
	s.push(2);
	s.push(1);
	
	cout << "\n 最新的堆栈是 ";print(s);
	cout << "\n 长度 " << s.size() << endl;
	cout << "\n 队首数字是 " << s.front() << endl;
	cout << "\n 队尾的数字是 " << s.back()<<endl;
	cout << "\n 去除栈中第一个元素表示为 ";s.pop();
	print(s);
	return 0;
}

  8.priority_queue(优先队列)

它仅考虑最高优先级元素。队列遵循FIFO策略,而优先队列根据优先级弹出元素,即,优先级最高的元素首先弹出。

它在某些方面类似于普通队列,但在以下方面有所不同:

  • 在优先队列中,队列中的每个元素都与某个优先级相关联,但是优先级在队列数据结构中不存在。

  • 优先队列中具有最高优先级的元素将被首先删除,而队列遵循FIFO(先进先出)策略,这意味着插入的元素将被首先删除。

  • 如果存在多个具有相同优先级的元素,则将考虑该元素在队列中的顺序。

注意:优先队列是普通队列的扩展版本,但优先级最高的元素将首先从优先队列中删除。

优先队列的函数

push()         它将新元素插入优先队列。 
pop()         它将优先级最高的元素从队列中删除。 
top()         此函数用于寻址优先队列的最顶层元素。 
size()         返回优先队列的大小。 
empty()         它验证队列是否为空。基于验证,它返回队列的状态。 
swap()         它将优先队列的元素与具有相同类型和大小的另一个队列交换。 
emplace()      它在优先队列的顶部插入一个新元素。 

#include <iostream>
#include<queue>
using namespace std;
priority_queue<int> p;  // 变量声明.
int main()
{
    
    p.push(10); // 插入 10 到队列, top=10
    p.push(20); 
    p.push(30); 
    p.push(15);
    cout <<  p.size() << endl;
    while (!p.empty())
    {
        cout << p.top() << endl;
        p.pop();
    }
    return 0;
}

 9.map(容器)

map是存储排序的键值对的关联容器,其中每个键都是唯一的,可以插入或删除,但不能更改。但是与键关联的值可以更改。

这个相关的代码还没大看明白呢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值