因为这些容器之间都是想通的,之前博主也已经讲了很多了,所以在这里就只展示一下个个容器的接口,和不同之处。
list
链表非连续的储存结构,相比于数组,链表插入和删除快,不会造成空间的浪费,但查询慢。
list接口
这些接口不一定都要记住,用的时候体会一下就好了
- 1.赋值: = 或
assign(n,ele)
//将n个ele付给本身 - 2.交换
:swap(stl)
两个容器元素互换 - 3.查看容器大小:
size()
- 4.查看容器是否为空:
empty()
- 5.重新指定容器大小:
resize(n,ele)
ele为默认填充元素,不填为默认0 - 6.链表尾部插入元素:
push_back(ele)
- 7.链表尾部删除元素:
pop_back()
- 8.链表首部插入元素:
push_front(ele)
- 9.链表首部删除元素:
pop_front()
- 10指定位置插入元素:
insert(post,ele)
注意此处pos为迭代器 例
list<int>::iterator iter = p.begin();
p.insert(iter, 10);
- 11.移除链表所有元素:
clear()
- 12.移除指定位置元素:
erase(pos)
注意此处pos为迭代器 - 13.移除指定元素节点:
remove(ele)
删除与ele相同的所有元素 - 14.取出链表第一个元素::
front()
- 15.取出链表最后一个元素:
back()
- 16.将元素中元素反转:
reverse()
- 17.链表排序:
sort()
//将元素从小到大排序
排序再讲一下如果我们想从大到小排序,或者元素是个对象是该怎么排序呢?
这时就要用到自己写的Bool类型的函数放到sort中了(我也不知道怎么讲看一下代码就懂了)
#include<iostream>
#include<string>
#include<list>
using namespace std;
class Person {
public:
Person(string name, int age) {
this->name = name;
this->age = age;
}
string name;
int age;
};
void print(list<Person>p) {
for (list<Person>::iterator iter = p.begin(); iter != p.end(); iter++) {
cout << "姓名为 " << iter->name << " 年龄 " << iter->age << endl;
}
}
//重点看这里
bool Mycompare(const Person& p1, const Person& p2) {//指定排序规则
return p1.age > p2.age;
}
int main() {
list<Person>p;
Person p1("老王", 20);
Person p2("老李", 30);
Person p3("老冯", 40);
Person p4("老马", 50);
Person p5("老哥", 10);
p.push_back(p1);
p.push_back(p2);
p.push_back(p3);
p.push_back(p4);
p.push_back(p5);
p.sort(Mycompare);
print(p);
}
set
set元素不允许出现相同元素,里面所有元素都会自动排序(通过二叉树实现)。当然如果想出现相同元素可以使用 multiset 容器
set容器
接口都差不多,这里主要讲三点。
- 查找该元素是否存在:
find()
存在返回该元素的迭代器,不存在返回x.end() - 查找该元素个数:
cout()
- 因为不允许元素重复,所以只能为0或1 set容器中所有元素都会排序,那元素是对象时该怎么排序,该如何自定义排序。
这时就要使用仿函数了,在定义set容器时,写入其参数列表
如下
#include<iostream>
#include<string>
#include<set>
using namespace std;
class Person {
public:
Person(string name,int age) {
this->name = name;
this->age = age;
}
string name;
int age;
};
//重写排序规则, 仿函数重点
class Mycompare {
public:
bool operator()( const Person &v1, const Person& v2) const {//仿函数改变排序规则,从大到小
return v1.age > v2.age;
}
};
void print(set<Person, Mycompare>& s) {
for (set<Person, Mycompare>::iterator iter = s.begin(); iter != s.end(); iter++)
{
cout << "姓名为 " <<iter->name<<" 年龄 "<<iter->age<< endl;
}
}
void test() {
//集合默认是按从小到大排序,因为自定义类型没法排序,所以必须重写排序规则。
set<Person, Mycompare>s;//须将仿函数放入模板参数列表
Person p1("老王",20);
Person p2("老李", 30);
Person p3("老冯",40);
Person p4("老马", 50);
Person p5("老哥", 10);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
s.insert(p5);
print(s);
}
int main() {
test();
}
对组
pair<T,T> p=make_pair(T x,T,y)
在这里顺便讲一下对组
可以用来返回来两个变量
pair<int, string> test() {
pair<int, string> p = make_pair(20, "秃头"); //创建对组,可以返回两个变量
return p;
}
pair<int, string> p = test();
cout << "姓名 " << p.second << " 年龄" << p.first;
map
map所有元素都是pair型
pair中第一个是key(键值),第二个是value(实值)
map容器中可以通过key快速找到value
map接口
因为基本都差不多我只讲一个插入
- 插入 :
insert(ele)
map<T,T> m;
m.insert(make_pair(T x,T y) );