stack queque list set/multiset map"/>
vector deque stack queque list set/multiset map
vector容器
1 vector构造函数
vector<T> 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<int> 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<int>::iterator itBegin = v1.begin();itBegin = itBegin + 2; //如果语法通过 支持随机访问
deque容器
1 deque构造函数
deque<T> 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<T> 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<T> 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<T> 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<T> st;//set默认构造函数:
mulitset<T> 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<string, int> p(string("Tom"), 18);
第二种声明
pair<string, int> 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<int, MyCompare>::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<Person, MyComparePerson> 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<Person,MyComparePerson>::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<T1, T2> mapTT;//map默认构造函数:
map(const map &mp);//拷贝构造函数
2 map赋值操作
map& operator=(const map &mp);//重载等号操作符
swap(mp);//交换两个集合容器
3 map大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
4 map插入数据元素操作
map.insert(...); //往容器插入元素,返回pair<iterator,bool>
//创建map容器
map<int, int> m;//插入方式//第一种m.insert(pair<int, int>(1, 10));//第二种m.insert(make_pair(2, 20));//第三种m.insert(map<int, int>::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<int, int, MyCompare> m;
class MyCompare
{
public:bool operator()(int v1,int v2){return v1 > v2;}
};
//指定map容器的排序规则
void test03()
{//插入4个值map<int, int, MyCompare> m;m.insert(pair<int, int>(1, 10));m.insert(make_pair(2, 20));m.insert(map<int, int>::value_type(3, 30));m[4] = 40;for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++){cout << " key = " << it->first << " value = " << (*it).second << endl;}
案例——员工分组
公司今天招聘了10个员工ABCDEFGHIJ,10名员工进入公司之后,需要指派员工在3个部门工作
人员信息有: 姓名 工资
通过Multimap进行信息的插入 保存 显示
分部门显示员工信息 显示全部员工信息
#include<iostream>;
using namespace std;
#include<string>
#include<vector>
#include<map>
#include<ctime>#define CEHUA 0
#define KAIFA 1
#define CESHI 2//公司今天招聘了10个员工,10名员工进入公司之后,需要指派员工在3个部门工作
//人员信息有: 姓名 工资
//通过Multimap进行信息的插入 保存 显示
//分部门显示员工信息 显示全部员工信息class Person
{
public:string name;int salary;
};void createPerson(vector<Person>&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<Person>&v, multimap<int, Person>&m)
{//遍历每一个员工来分组for (vector<Person>::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<int, Person>&m)
{cout << "策部门:" << endl;//找到策划部门是从哪一个员工开始的multimap<int, Person>::iterator pos = m.find(CEHUA);//查找有几个策划部门的员工,为后面循环添加条件int num = m.count(CEHUA);//记录索引次数int index = 0;for (; pos != m.end() && index < num; pos++, index++){cout << "姓名:" <<pos->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));vector<Person>v;//1.创建员工createPerson(v);//2.随机分组multimap<int, Person>m;setGrope(v, m);//3.分部门显示员工showPerson(m);system("pause");return 0;
}
更多推荐
vector deque stack queque list set/multiset map
发布评论