vector deque stack queque list set/multiset map

vector容器

1 vector构造函数
vector v; //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);//构造函数将n个elem拷贝给本身。
vector(const vector &vec);//拷贝构造函数。

//例子 使用第二个构造函数 我们可以...
int arr[] = {2,3,4,1,9};
vector v1(arr, arr + sizeof(arr) / sizeof(int));

2 vector常用赋值操作
1.assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
2.assign(n, elem);//将n个elem拷贝赋值给本身。
3.vector& operator=(const vector  &vec);//重载等号操作符
swap(vec);// 将vec与本身的元素互换。

3 vector大小操作
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

4 vector数据存取操作
at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素

5 vector插入和删除操作
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
push_back(ele); //尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素

// vector容器的迭代器  随机访问迭代器
//如何判断一个容器的迭代器是否支持随机访问

vector::iterator itBegin = v1.begin();

itBegin = itBegin + 2; //如果语法通过 支持随机访问

deque容器

1 deque构造函数
deque deqT;//默认构造形式
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将n个elem拷贝给本身。
deque(const deque &deq);//拷贝构造函数。

2 deque赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符 直接d1=d2
swap(deq);// 将deq与本身的元素互换

3 deque大小操作
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。

4 deque双端插入和删除操作
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据

5 deque数据存取
at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。              d.at(i)
operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。 d[i]
front();//返回第一个数据。
back();//返回最后一个数据


6 deque插入操作
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。


7 deque删除操作
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。
 

8 deque排序
sort( begin, end ) 利用sort排序,默认从小到大升序排序

对于支持随机访问的迭代器的容器都可以用sort 要添加algorithm头文件

stack容器

栈容器符合先进后出,不允许有遍历行为,栈用enpty可以判断容器是否为空,用size可以返回栈中数据个数
1 stack构造函数
stack stkT; //stack采用模板类实现, stack对象的默认构造形式:
stack(const stack &stk);//拷贝构造函数


2 stack赋值操作
stack& operator=(const stack &stk);//重载等号操作符


3 stack数据存取操作
push(elem);//向栈顶添加元素
pop();//从栈顶移除第一个元素
top();//返回栈顶元素


4 stack大小操作
empty();//判断堆栈是否为空
size();//返回堆栈的大小
 

queque容器

queque队列是先进先出的数据结构。只能从一端新增数据,另一端移除元素,不允许有遍历行为

1 queue构造函数
queue queT ; //queue采用模板类实现,queue对象的默认构造形式:
queue(const queue &que);//拷贝构造函数


2 queue存取、插入和删除操作
push(elem);//往队尾添加元素
pop();//从队头移除第一个元素
back();//返回最后一个元素
front();//返回第一个元素

3 queue赋值操作
queue& operator=(const queue &que);//重载等号操作符


4 queue大小操作
empty();//判断队列是否为空
size();//返回队列的大小
 

list链表

链表可以对任意位置进行快速的插入或删除。stl中提供的是双向循环链表和双向迭代器,只能++来访问

但是对元素的遍历速度没有数组快,list是由数据域和指针域共同组成的,所以占用的空间比较大,动态存储分配,不会造成空间浪费,与vector(溢出后删除)不一样的是,list插入数据后不会对其后的数据产生影响。

1 list构造函数
list lstT;//list采用采用模板类实现,对象的默认构造形式:用push_back()赋值
list(beg,end);//构造函数将[beg, end)区间中的元素拷贝给本身。
list(n,elem);//构造函数将n个elem拷贝给本身。
list(const list &lst);//拷贝构造函数。


2 list数据元素插入和删除操作
push_back(elem);//在容器尾部加入一个元素
pop_back();//删除容器中最后一个元素
push_front(elem);//在容器开头插入一个元素
pop_front();//从容器开头移除第一个元素

用迭代器
insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。

remove(elem);//删除容器中所有与elem值匹配的元素。

3 list大小操作
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(num);//重新指定容器的长度为num,
若容器变长,则以默认值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem);//重新指定容器的长度为num,
若容器变长,则以elem值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。

4 list赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
list& operator=(const list &lst);//重载等号操作符
swap(lst);//将lst与本身的元素互换。


5 list数据的存取

list不是连续的存储空间,不能利用 [ ] 和 at 来跳跃式访问,支持双向 it++/ it--
front(); //返回第一个元素。
back(); //返回最后一个元素。

6 list反转排序
reverse(); //反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。
sort(); //list排序

 排序  
 所有系统提供标准算法  使用的容器提供的迭代器必须支持随机访问
 不支持随机访问的迭代器的容器 ,内部会对应提供相应的算法的接口
 sort(L.begin(), L.end());
 L.sort(); //默认排序规则  从小到大

 修改排序规则 为 从大到小
 L.sort(myCompare);

自定义的数据类型 必须指定排序规则 专门写一个函数
L.sort(myComparePerson);

set容器

所有元素在插入时会自动排序,从小到大排序,set不允许重复的数据。multiset允许重复的数据

1 set构造函数
set st;//set默认构造函数:
mulitset mst; //multiset默认构造函数:
set(const set &st);//拷贝构造函数

2 set赋值操作
set& operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器

3 set大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空 

4 set插入和删除操作
insert(elem);//在容器中插入元素。(只有insert)
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。

5 set查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);//查找键key的元素个数

    pair对组
    第一种
    pair p(string("Tom"), 18);

    第二种声明
    pair p2 = make_pair("Jerry", 20); 

    用p.first 和 p.second 访问两个数据

6 set排序

set存放内置数据类型

//利用仿函数 指定set容器的排序规则
class MyCompare
{
public:
	bool operator()(int v1 ,int v2)//重载小括号
	{
		return v1 > v2;
	}
};
//插入之前 指定排序规则
	for (set::iterator it = s.begin(); it != s.end();it++)
	{
		cout << *it << endl;
	}

set存放自定义数据类型(对于自定义数据类型,必须指定排序规则)


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

	string m_Name;
	int m_Age;
};

class MyComparePerson
{
public:
	bool operator()(const  Person & p1 , const Person & p2)
	{
		//年龄 升序
		return p1.m_Age < p2.m_Age;
	}

};

void test06()
{
	set s;

	Person p1("aaa", 10);
	Person p2("bbb", 30);
	Person p3("ccc", 20);
	Person p4("ddd", 50);
	Person p5("eee", 40);

	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);
	s.insert(p5);

	//对于自定义数据类型,必须指定排序规则
	for (set::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << "姓名: " << (*it).m_Name << " 年龄: " << it->m_Age << endl;
	}
}

map容器

map所有元素都是pair,一个元素是key,起到索引作用,另一个元素是value,所有元素会根据键值自动排序。map和multimap的区别是 是否可以含有重复的key值。

1 map构造函数
map mapTT;//map默认构造函数:
map(const map &mp);//拷贝构造函数

2 map赋值操作
map& operator=(const map &mp);//重载等号操作符
swap(mp);//交换两个集合容器

3 map大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空

4 map插入数据元素操作
map.insert(...); //往容器插入元素,返回pair

//创建map容器
map m;

	//插入方式
	//第一种
	m.insert(pair(1, 10));

	//第二种
	m.insert(make_pair(2, 20));

	//第三种
	m.insert(map::value_type(3, 30));

	//第四种不建议插数,建议用来查找数据
	m[4] = 40;

5 map删除操作
clear();//删除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(keyElem);//删除容器中key为keyElem的对组。

//按照key进行删除元素
   m.erase(3); 
//全删除
   m.clear();
//用迭代器删除
   m.erase(m.begin());

6 map查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
 

7 map排序

在插入数之前就要提前制定排序规则    map m;

class MyCompare
{
public:
	bool operator()(int v1,int v2)
	{
		return v1 > v2;
	}
};
//指定map容器的排序规则
void test03()
{
	//插入4个值
    map m;
	m.insert(pair(1, 10));
	m.insert(make_pair(2, 20));
	m.insert(map::value_type(3, 30));
	m[4] = 40;

	for (map::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << " key =  " << it->first << " value = " << (*it).second << endl;
	}

案例——员工分组

公司今天招聘了10个员工ABCDEFGHIJ,10名员工进入公司之后,需要指派员工在3个部门工作
人员信息有: 姓名 工资
通过Multimap进行信息的插入 保存 显示
分部门显示员工信息 显示全部员工信息

#include;
using namespace std;
#include
#include
#include
#include

#define CEHUA 0
#define KAIFA 1
#define CESHI 2

//公司今天招聘了10个员工,10名员工进入公司之后,需要指派员工在3个部门工作
//人员信息有: 姓名 工资
//通过Multimap进行信息的插入 保存 显示
//分部门显示员工信息 显示全部员工信息

class Person
{
public:
	string name;
	int salary;
};

void createPerson(vector&v)
{
	string nameseed = "ABCDEFGHIJ";
	for (int i = 0; i < 10; i++)
	{
		Person worker;
		worker.name = "员工";
		worker.name += nameseed[i];
		//cout << worker.name << endl;
		worker.salary = rand() % 10000 + 10000;
		//将员工放入容器中
		v.push_back(worker);
	}
}

void setGrope(vector&v, multimap&m)
{
	//遍历每一个员工来分组
	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		//产生0~2编号
		int id = rand() % 3;
		//将员工插入到分组中,key是部门编号,value是具体员工
		m.insert(make_pair(id, *it));
	}
}

void showPerson( multimap&m)
{
	cout << "策部门:" << endl;
	//找到策划部门是从哪一个员工开始的
	multimap::iterator pos = m.find(CEHUA);
	//查找有几个策划部门的员工,为后面循环添加条件
	int num = m.count(CEHUA);
	//记录索引次数
	int index = 0;
	for (; pos != m.end() && index < num; pos++, index++)
	{
		cout << "姓名:" <second.name<< "工资" << pos->second.salary << endl;
	}
		
	cout << "开发部门:" << endl;
	pos = m.find(KAIFA);
	num = m.count(KAIFA);
	index = 0;
	for (; pos != m.end() && index < num; pos++, index++)
	{
		cout << "姓名:" << pos->second.name << "工资" << pos->second.salary << endl;
	}
		
	cout << "测试部门:" << endl;
	pos = m.find(CESHI);
	num = m.count(CESHI);
	index = 0;
	for (; pos != m.end() && index < num; pos++, index++)
	{
		cout << "姓名:" << pos->second.name << "工资" << pos->second.salary << endl;
	}
}

int main()
{
	srand((unsigned int)time(NULL));
	vectorv;
	//1.创建员工
	createPerson(v);

	//2.随机分组
	multimapm;
	setGrope(v, m);

	//3.分部门显示员工
	showPerson(m);

	system("pause");
	return 0;
}

你可能感兴趣的:(c++,学习)