queue
构造函数:
queue<T> que; "queue采用模板类实现,queue对象的默认构造形式"
queue(const queue &que); "拷贝构造函数"
赋值操作:
queue& operator=(const queue &que); "重载等号操作符"
数据存取:
push(elem); "往队尾添加元素"
pop(); "从队头移除第一个元素"
back(); "返回最后一个元素"
front(); "返回第一个元素"
大小操作:
empty(); "判断堆栈是否为空"
size(); "返回栈的大小"
注意:队列不支持迭代器,也不允许随机访问。
List
list的迭代器只能 "++" 和 "--" ,不能 " it = it + 1; "
lisst本质是“双向”+“循环”链表。
list的创建
list<T> lst; "list采用采用模板类实现,对象的默认构造形式:"
list(beg,end); "构造函数将[beg, end)区间中的元素拷贝给本身。"
list(n,elem); "构造函数将n个elem拷贝给本身。"
list(const list &lst); "拷贝构造函数。"
list的赋值和交换
L2 = L1; ""
L3.assign(L2.begin(), L2.end());
L4.assign(10, 100);
L1.swap(L2);
list大小操作
size(); "返回容器中元素的个数"
empty(); "判断容器是否为空"
resize(num); "重新指定容器的长度为num,若容器变长,则以默认值填充新位置。"
"如果容器变短,则末尾超出容器长度的元素被删除。"
resize(num, elem); "重新指定容器的长度为num,若容器变长,则以elem值填充新位置。"
"如果容器变短,则末尾超出容器长度的元素被删除。"
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值匹配的元素。"
list数据存取
front(); "返回第一个元素。"
back(); "返回最后一个元素。"
list的反转和排序
reverse(); "反转链表"
sort(); "链表排序"
Example:按年龄排序,如果同龄则按照身高排序;
#include <list>
#include <string>
class Person {
public:
Person(string name, int age , int height) {
m_Name = name;
m_Age = age;
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;
}
else
{
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("赵云", 25 , 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_Name << " 年龄: " << it->m_Age
<< " 身高: " << it->m_Height << endl;
}
cout << "---------------------------------" << endl;
L.sort(ComparePerson); //排序
for (list<Person>::iterator it = L.begin(); it != L.end(); it++) {
cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age
<< " 身高: " << it->m_Height << endl;
}
}
int main() {
test01();
system("pause");
return 0;
}
set&&multiset
set不允许容器中有重复的元素
multiset允许容器中有重复的元素
set的创建
set<T> st; "默认构造函数:"
set(const set &st); "拷贝构造函数"
set& operator=(const set &st); "重载等号操作符"
set的大小和交换
size(); "返回容器中元素的数目"
empty(); "判断容器是否为空"
swap(st); "交换两个集合容器"
set的插入和删除
insert(elem); "在容器中插入元素。"
clear(); "清除所有元素"
erase(pos); "删除pos迭代器所指的元素,返回下一个元素的迭代器。"
erase(beg, end); "删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。"
erase(elem); "删除容器中值为elem的元素。这个好!!!"
set的查找和统计
find(key); "查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();"
count(key); "统计key的元素个数(其实只有 0 or 1 这两种情况)"
set<int>::iterator pos = s1.find(30); " 用迭代器来查找"
"以下代码用来判断到底有没有这个元素"
if (pos != s1.end())
{
cout << "找到了元素 : " << *pos << endl;
}
else
{
cout << "未找到元素" << endl;
}
set和multiset的区别
set不可以插入重复数据,
而multiset可以 set插入数据的同时会返回插入结果,表示插入是否成功
multiset不会检测数据,因此可以插入重复数据
pair对组的创建
pair<type, type> p ( value1, value2 );
pair<type, type> p = make_pair( value1, value2 );
"对组创建"
void test01()
{
pair<string, int> p(string("Tom"), 20);
cout << "姓名: " << p.first << " 年龄: " << p.second << endl;
pair<string, int> p2 = make_pair("Jerry", 10);
cout << "姓名: " << p2.first << " 年龄: " << p2.second << endl;
}
set自定义排序
set<int,MyCompare> s2;
set<Person, comparePerson> s;
"如果是自定义的数据类型,比如结构体,那么就必须告诉set排序的标准"