功能:
vector与普通数组区别:
动态扩展:

功能描述:
函数原型:
vector v; //采用模板实现类实现,默认构造函数vector(v.begin(), v.end()); //将v[begin(), end())区间中的元素拷贝给本身。vector(n, elem); //构造函数将n个elem拷贝给本身。vector(const vector &vec); //拷贝构造函数。示例:
#include
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int> v1; //无参构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
vector<int> v2(v1.begin(), v1.end());
printVector(v2);
vector<int> v3(10, 100);
printVector(v3);
vector<int> v4(v3);
printVector(v4);
}
int main() {
test01();
system("pause");
return 0;
}
总结:vector的多种构造方式没有可比性,灵活使用即可
功能描述:
函数原型:
vector& operator=(const vector &vec);//重载等号操作符
assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem); //将n个elem拷贝赋值给本身。
示例:
#include
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
//赋值操作
void test01()
{
vector<int> v1; //无参构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
vector<int>v2;
v2 = v1;
printVector(v2);
vector<int>v3;
v3.assign(v1.begin(), v1.end());
printVector(v3);
vector<int>v4;
v4.assign(10, 100);
printVector(v4);
}
int main() {
test01();
system("pause");
return 0;
}
总结: vector赋值方式比较简单,使用operator=,或者assign都可以
功能描述:
函数原型:
empty(); //判断容器是否为空
capacity(); //容器的容量
size(); //返回容器中元素的个数
resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
示例:
#include
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
if (v1.empty())
{
cout << "v1为空" << endl;
}
else
{
cout << "v1不为空" << endl;
cout << "v1的容量 = " << v1.capacity() << endl;
cout << "v1的大小 = " << v1.size() << endl;
}
//resize 重新指定大小 ,若指定的更大,默认用0填充新位置,可以利用重载版本替换默认填充
v1.resize(15,10);
printVector(v1);
//resize 重新指定大小 ,若指定的更小,超出部分元素被删除
v1.resize(5);
printVector(v1);
}
int main() {
test01();
system("pause");
return 0;
}
总结:
功能描述:
函数原型:
push_back(ele); //尾部插入元素elepop_back(); //删除最后一个元素insert(const_iterator pos, ele); //迭代器指向位置pos插入元素eleinsert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素eleerase(const_iterator pos); //删除迭代器指向的元素erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素clear(); //删除容器中所有元素示例:
#include
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
//插入和删除
void test01()
{
vector<int> v1;
//尾插
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
printVector(v1);
//尾删
v1.pop_back();
printVector(v1);
//插入
v1.insert(v1.begin(), 100);
printVector(v1);
v1.insert(v1.begin(), 2, 1000);
printVector(v1);
//删除
v1.erase(v1.begin());
printVector(v1);
//清空
v1.erase(v1.begin(), v1.end());
v1.clear();
printVector(v1);
}
int main() {
test01();
system("pause");
return 0;
}
总结:
功能描述:
函数原型:
at(int idx); //返回索引idx所指的数据operator[]; //返回索引idx所指的数据front(); //返回容器中第一个数据元素back(); //返回容器中最后一个数据元素示例:
#include
void test01()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
for (int i = 0; i < v1.size(); i++)
{
cout << v1.at(i) << " ";
}
cout << endl;
cout << "v1的第一个元素为: " << v1.front() << endl;
cout << "v1的最后一个元素为: " << v1.back() << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:
功能描述:
函数原型:
swap(vec); // 将vec与本身的元素互换示例:
#include
void printVector(vector<int>& v) {
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
vector<int>v2;
for (int i = 10; i > 0; i--)
{
v2.push_back(i);
}
printVector(v2);
//互换容器
cout << "互换后" << endl;
v1.swap(v2);
printVector(v1);
printVector(v2);
}
void test02()
{
vector<int> v;
for (int i = 0; i < 100000; i++) {
v.push_back(i);
}
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
v.resize(3);
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
//收缩内存
vector<int>(v).swap(v); //匿名对象
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
}
int main() {
test01();
test02();
system("pause");
return 0;
}
总结:swap可以使两个容器互换,可以达到实用的收缩内存效果
功能描述:
函数原型:
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
示例:
#include
void test01()
{
vector<int> v;
//预留空间
v.reserve(100000);
int num = 0;
int* p = NULL;
for (int i = 0; i < 100000; i++) {
v.push_back(i);
if (p != &v[0]) {
p = &v[0];
num++;
}
}
cout << "num:" << num << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:如果数据量较大,可以一开始利用reserve预留空间
概念
stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口。
stack的一些特点:

栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
栈中进入数据称为 — 入栈 push
栈中弹出数据称为 — 出栈 pop
功能描述:栈容器常用的对外接口
构造函数:
stack stk; //stack采用模板类实现, stack对象的默认构造形式stack(const stack &stk); //拷贝构造函数赋值操作:
stack& operator=(const stack &stk); //重载等号操作符数据存取:
push(elem); //向栈顶添加元素pop(); //从栈顶移除第一个元素top(); //返回栈顶元素大小操作:
empty(); //判断堆栈是否为空size(); //返回栈的大小其实栈和队列都是可以由链表改造过来的。原理基本与栈一样。
概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。

队列容器只允许从一端新增元素,从另一端移除元素(参考现在做的核酸检测排队)
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
队列中进数据称为 — 入队 push
队列中出数据称为 — 出队 pop
功能描述:栈容器常用的对外接口
构造函数:
queue que; //queue采用模板类实现,queue对象的默认构造形式queue(const queue &que); //拷贝构造函数赋值操作:
queue& operator=(const queue &que); //重载等号操作符数据存取:
push(elem); //往队尾添加元素pop(); //从队头移除第一个元素back(); //返回最后一个元素front(); //返回第一个元素大小操作:
empty(); //判断堆栈是否为空size(); //返回栈的大小总结:
**功能:**将数据进行链式存储
链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列结点组成
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表(有两个指针分别指向前驱和后继,且最后一个节点记录的是第一个有效节点的位置,第一个有效节点的前一个节点记录的是最后一个节点的位置)

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器
list的优点:
list的缺点:
List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。
总结:STL中List和vector是两个最常被使用的容器,各有优缺点
功能描述:
函数原型:
list lst; //list采用采用模板类实现,对象的默认构造形式:list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。list(n,elem); //构造函数将n个elem拷贝给本身。list(const list &lst); //拷贝构造函数。总结:list构造方式同其他几个STL常用容器,熟练掌握即可
功能描述:
函数原型:
assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。assign(n, elem); //将n个elem拷贝赋值给本身。list& operator=(const list &lst); //重载等号操作符swap(lst); //将lst与本身的元素互换。功能描述:
函数原型:
size(); //返回容器中元素的个数
empty(); //判断容器是否为空
resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
功能描述:
函数原型:
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值匹配的元素。在erease与insert当中,都是需要提供迭代器的,迭代器可以与运算符相结合(++,- - 之类的)
总结:
功能描述:
函数原型:
front(); //返回第一个元素。back(); //返回最后一个元素。 //list容器的迭代器是双向迭代器,不支持随机访问
list<int>::iterator it = L1.begin();
it = it + 1;//错误,不可以跳跃访问,即使是+1
it++;//正确,前移
it--;//正确,后移
总结:
功能描述:
函数原型:
reverse(); //反转链表sort(); //链表排序使用sort的时候需要注意,首先要包含algorithm的头文件,其次,所有不支持随机访问迭代器的容器,不可以使用标准算法。所以,不支持随机访问迭代器的容器,内部会提供一些算法。
//排序
L.sort(); //默认的排序规则 从小到大
printList(L);
sort(L1.begin(), L1.end());//这个就是错误的,因为标准算法只支持随机访问的迭代器容器
加入仿函数的规则。例如此题:排序规则,按照年龄进行升序,如果年龄相同按照身高进行降序。
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;
}
}
//
L.sort(ComparePerson);//把仿函数的名字加进去就行
简介:
本质:
set和multiset区别:
功能描述:创建set容器以及赋值
构造:
set st; //默认构造函数:set(const set &st); //拷贝构造函数赋值:
set& operator=(const set &st); //重载等号操作符PS:
set容器在插入中,只有insert的方式,没有oush,pop的方式。
功能描述:
函数原型:
size(); //返回容器中元素的数目empty(); //判断容器是否为空swap(st); //交换两个集合容器功能描述:
函数原型:
insert(elem); //在容器中插入元素。clear(); //清除所有元素erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(elem); //删除容器中值为elem的元素。功能描述:
函数原型:
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();count(key); //统计key的元素个数学习目标:
区别:
功能描述:
两种创建方式:
pair p ( value1, value2 ); pair p = make_pair( value1, value2 ); #include
#include
using namespace std;
#include
//对组创建
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;
}
int main() {
test01();
system("pause");
return 0;
}
总结:
两种方式都可以创建对组,记住一种即可
学习目标:
主要技术点:
#include
#include
using namespace std;
class MyCompare
{
public:
bool operator()(int v1, int v2) {
return v1 > v2;
}
};
void test01()
{
set<int> s1;
s1.insert(10);
s1.insert(40);
s1.insert(20);
s1.insert(30);
s1.insert(50);
//默认从小到大
for (set<int>::iterator it = s1.begin(); it != s1.end(); it++) {
cout << *it << " ";
}
cout << endl;
//指定排序规则
//按照仿函数的规则进行插入
set<int,MyCompare> s2;
s2.insert(10);
s2.insert(40);
s2.insert(20);
s2.insert(30);
s2.insert(50);
for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
关于bool operator()(int v1, int v2)当中的两个括号的解释,第一个括号表示的是需要重载的符号,第二个括号表示重载符号函数体的参数列表。
仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
#include
using namespace std;
class Time
{
public:
//小括号重载 版本0
void operator()()
{
cout<< "version 0"<<endl;
}
//小括号重载 版本1
void operator()(int h)
{
cout<< "version 1"<<endl;
}
//小括号重载 版本2
void operator()(int h, int m)
{
cout<< "version 2"<<endl;
}
};
int main()
{
Time t;
t();
t(1); //小括号重载 版本1
t(1,1); //小括号重载 版本2
return 0;
}
直接举例,按照年龄顺序降序排列。
#include
#include
#include
using namespace std;
class Person
{
public:
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
class comparePerson
{
public:
bool operator()(const Person& p1, const Person& p2)
{
//按照年龄做降序
return p1.m_Age > p2.m_Age;
}
};
void test01()
{
set<Person,comparePerson>s;
//创建Person对象
Person p1("刘备", 23);
Person p2("关羽", 27);
Person p3("张飞", 25);
Person p4("赵云", 21);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
for (set<Person, comparePerson>::iterator it = s.begin(); it!= s.end(); ++it)
{
cout << "姓名:" << (*it).m_Name << "年龄:" << (*it).m_Age << endl;
}
}
int main()
{
test01();
system("pause");
return 0;
}
简介:
本质:
优点:
map和multimap区别:
功能描述:
函数原型:
构造:
map mp; //map默认构造函数:map(const map &mp); //拷贝构造函数赋值:
map& operator=(const map &mp); //重载等号操作符在向map当中插入值得时候,记住一定要插入一个pair,因为map的基本就是pair组成的。
功能描述:
函数原型:
size(); //返回容器中元素的数目empty(); //判断容器是否为空swap(st); //交换两个集合容器功能描述:
函数原型:
insert(elem); //在容器中插入元素。clear(); //清除所有元素erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(key); //删除容器中值为key的元素。#include
void printMap(map<int,int>&m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "key = " << it->first << " value = " << it->second << endl;
}
cout << endl;
}
void test01()
{
//插入
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; //不建议用此方法
printMap(m);
//删除
m.erase(m.begin());
printMap(m);
m.erase(3);//按照key删除
printMap(m);
//清空
m.erase(m.begin(),m.end());
m.clear();
printMap(m);
}
int main() {
test01();
system("pause");
return 0;
}
不建议[ ]进行插入操作,但可以用于key访问value。
总结:
功能描述:
按照key的方式去查找/统计,对map而言无非就是0/1。
函数原型:
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();count(key); //统计key的元素个数学习目标:
主要技术点:
示例:
#include
class MyCompare {
public:
bool operator()(int v1, int v2) {
return v1 > v2;
}
};
void test01()
{
//默认从小到大排序
//利用仿函数实现从大到小排序
map<int, int, MyCompare> m;
m.insert(make_pair(1, 10));
m.insert(make_pair(2, 20));
m.insert(make_pair(3, 30));
m.insert(make_pair(4, 40));
m.insert(make_pair(5, 50));
for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key:" << it->first << " value:" << it->second << endl;
}
}
int main() {
test01();
system("pause");
return 0;
}
总结: