学习一下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双端队列
#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是存储排序的键值对的关联容器,其中每个键都是唯一的,可以插入或删除,但不能更改。但是与键关联的值可以更改。
这个相关的代码还没大看明白呢