0
点赞
收藏
分享

微信扫一扫

一些常用STL容器总结

云上笔记 2022-03-22 阅读 38
c++

stack 容器

只有栈顶元素才可以被外界使用,不允许有遍历行为

  • 构造函数

      stack<T> stk;
      
      stack(const stack &stk);
    
  • 赋值操作

      stack& operator=(const stack &stk);
    
  • 数据存取

      push(elem);
      
      pop();
      
      top();
    
  • 大小操作

      empty();
    
      size();
    

queue 容器

  • 构造函数

      queue<T> que;
      
      queue(const queue &stk);
    
  • 赋值操作

      queue& operator=(const queue &que);
    
  • 数据存取

      push(elem);
      
      pop();
      
      back();
    
      front();
    
  • 大小操作

      empty();
    
      size();
    

set / multiset 容器

本质: 属于关联式容器,底层结构用二叉树实现

区别: set不允许容器中有重复的元素, multiset允许容器中有重复的元素

  • 构造和赋值操作

      set<T> st;
      
      set(const set& st);
      
      set& operator=(const set &st);
    
      插入数据只有insert方式,并且所有元素插入时被自动排序。
    
  • 大小和交换

      size();
    
      empty();
    
      swap();
    
  • 插入和删除

      insert(elem);
    
      clear();
    
      erase(pos);
    
      erase(beg, end);
    
      erase(elem);
    
  • 查找和统计

      find(key);//如果元素存在返回该元素的位置,否则返回容器结束的位置
      
      count(key);//统计key元素个数
    
  • pari 使用

创建方式:

//利用对组可以返回两个数据	

pair<type, type> p(value1, value2);

pair<type, type> p = make_pair(value1, value2);

//第一种
pair<string, int>p("Tom", 20);

//第二种
pair<string, int>p2 = make_pair("Jerry", 30);
  • set 容器排序

技术点:利用仿函数,改变排序规则

示例一:

1. set存放内置数据类型

class MyCompare
{
public:
	bool operator()(int v1, int v2) const //返回类型是bool型,重载的符号是()。仿函数
	{
		return v1 > v2;
	}
};

void test01()
{
	set<int, MyCompare> s1;

	s1.insert(10);
	s1.insert(20);
	s1.insert(30);
	s1.insert(60);
	s1.insert(50);
	s1.insert(90);

	for (set<int, MyCompare>::iterator it = s1.begin(); it != s1.end(); it++)
	{
		cout << *it << " ";
	}
}

利用仿函数可以指定set容器的排序规则

2. set存放自定义数据类型

class Person
{
public:

	Person(string name, int age, int height)
	{
		this->m_Name = name;
		this->m_Age = age;
		this->m_Height = height;
	}
public:

	string m_Name;
	int m_Age;
	int m_Height;
};

class MyCompare
{
public:
	bool operator()(const Person& v1, const Person& v2) const //返回类型是bool型,重载的符号是()。仿函数
	{
		return v1.m_Age > v2.m_Age;
	}
};

void test01()
{
	set<Person, MyCompare> s1;//自定义数据类型要自行制定排序规则

	Person p1("堂本光一", 10, 170);
	Person p2("堂本刚", 11, 171);
	Person p3("谢霆锋", 12, 175);
	Person p4("肖战", 26, 170);
	Person p5("王一博", 20,170);
	Person p6("丁真", 18, 170);

	s1.insert(p1);
	s1.insert(p2);
	s1.insert(p3);
	s1.insert(p4);
	s1.insert(p5);
	s1.insert(p6);

	for (set<Person, MyCompare>::iterator it = s1.begin(); it != s1.end(); it++)
	{
		cout << it->m_Name << " " << it->m_Age << " " << it->m_Height << endl;
	}
}

map / multimap 容器

简介: map中所有元素都是pair,pair中第一个元素为key,起到索引作用,第二个元素为value(实值),所有元素都会根据键值自动排序,可以根据键值快速找到value值

本质: 属于关联式容器,底层结构用二叉树实现

区别: map不允许容器中有重复的key元素, multimap允许容器中有重复的key元素

  • 构造和赋值操作

      map<T1, T2> mp;
      
      map(const map &mp);
      
      map& operator=(const map &mp);
    
      map<int, int> m;
      
      m.insert(pair<int, int>(1, 10));
    
      cout << (*it).first << (*it).second << endl;
    
  • 大小和操作

      size();
    
      empty();
    
      swap();
    
  • 插入和删除

      insert(elem);
      
      clear();
      
      erase(pos);
      
      erase(beg, end);
      
      erase(key);
    
      map<int, int> m;
      
      m.insert(make_pair(2, 20));
    
  • 查找和统计

      find(key); //查找key是否存在,若存在返回该键的元素的迭代器,若不存在,返回map.end()
    
      count(key);
    
  • map容器排序

  • 利用仿函数改变排序规则

同其它容器

map<int, int, MyCompare> m;

list 容器

将数据进行链式存储,STL中的链表是一个双循环链表,遍历速度没有数组快,灵活但占用空间大

  • 函数原型

      list<T> list;
      
      list(beg, end);
      
      list(n, elem);
      
      list(const list& list);//拷贝构造函数
    

list 赋值和交换

  • 函数原型

      assign(beg, end);
      
      assign(n, elem);
      
      list& operator=(const list &list);
      
      swap(list);
    

list 大小操作

  • 函数原型

      size();
    
      empty();
    
      resize(num);
    
      resize(num, elem);
    

list 大小操作

  • 函数原型

      push_back(elem);
    
      pop_back();
    
      push_front(elem);
    
      pop_front();
    
      insert(pos, elem); // 必须提供迭代器
    
      insert(pos, n, elem);
    
      insert(pos, beg, end);
    
      clear();
    
      erase(beg, end);  必须提供迭代器
    
      erase(pos);
    
      remove(elem);
    

list 数据存取

  • 函数原型

      front(); //返回第一个元素
      
      back(); //返回最后一个元素
    

迭代器不支持随机访问,只能递增或者递减

list 反转和排序

reverse(); //反转链表

sort(); //链表排序

如何写降序函数

bool myCompare(int v1, int v2)
{
	return v1 > v2;
}

L1.sort(myCompare);//降序排列

list 排序案例

#include <iostream>
using namespace std;
#include <deque>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <list>

class Person
{
public:

	Person(string name, int age, int height)
	{
		this->m_Name = name;
		this->m_Age = age;
		this->m_Height = height;
	}
public:

	string m_Name;
	int m_Age;
	int m_Height;
};

//指定排序规则
bool comparePerson(Person& p1, Person& p2)
{
	//按照年龄升序
	if (p1.m_Age == p2.m_Age)
	{
		return p1.m_Height > p2.m_Height;
	}
	return p1.m_Age < p2.m_Age;
}

void test01()
{
	list<Person> L;

	Person p1("刘备", 35, 175);
	Person p2("曹操", 45, 180);
	Person p3("孙权", 40, 170);
	Person p4("赵云", 26, 190);
	Person p5("张飞", 35, 160);
	Person p6("关羽", 35, 200);

	L.push_back(p1);
	L.push_back(p2);
	L.push_back(p3);
	L.push_back(p4);
	L.push_back(p5);
	L.push_back(p6);

	for (list<Person>::iterator it = L.begin(); it != L.end(); it++)
	{
		cout << it->m_Age << " " << it->m_Name << " " << it->m_Height << endl;
	}
	cout << "排序后: " << endl;

	L.sort(comparePerson);

	for (list<Person>::iterator it = L.begin(); it != L.end(); it++)
	{
		cout << it->m_Age << " " << it->m_Name << " " << it->m_Height << endl;
	}
}

int main()
{
	test01();

	system("pause");

	return 0;
}

deque 容器

deque是双端数组,可以对头端进行删除操作

deque与vector区别:

1.vector单端数组,对于头部的插入效率较低,数据量越大,效率越低

2.deque对头部的插入速度比vector快

3.vector访问元素时的速度会比deque快,这和两者内部实现有关

deque内部工作原理:deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据,中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间,因此访问数据会慢一些。

  • deque构造函数

函数原型:

deque<T> deqT;//默认构造形式

deque(beg, end);//构造函数将[beg,end]区间中的元素拷贝给本身

deque(n, elem);//构造函数将n个elem拷贝给本身

deque(const deque &deq);//拷贝构造函数

示例:

void myprint(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
const 限制容器为只读不可修改,于是it的类型也应该是const类型,由const性质可得。
  • deque赋值操作

函数原型:

deque& operator=(const deque& deq);//重载等号操作符

assign(beg, end);//将[beg,end]区间中的数据拷贝赋值给本身

assign(n, elem);//将n个elem拷贝赋值给本身
  • deque大小操作

函数原型:

说明:类似vector,但没有容量限制,因此没有capacity函数

empty();

size();

resize(num);

resize(num, elem);
  • deque插入和删除

函数原型:

push_back(elem);

push_front(elem);

pop_back();//删除最后一个数据

pop_front();//删除第一个数据

insert(pos, elem); //在pos位置插入elem,返回新数据的位置

insert(pos, n, elem); //在pos位置插入n个elem数据,无返回值

insert(pos, beg, end); //插入区间数据,无返回值

clear();

earse(beg, end);//删除区间数据,返回下一个数据的位置

earse(pos); //删除pos位置的数据,返回下一个数据的位置
  • deque数据存取

函数原型:

at(int idx);

operator[];

front();

back();
  • deque排序操作

函数原型:

sort(itrator beg, iterator end);//对区间内的数据进行排序,升序

所有算法必须包含的头文件 <algorithm>,STL三大组件,容器、算法和迭代器
举报

相关推荐

0 条评论