#include <iostream>

using namespace std;

void swapInt(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
} void swapDouble(double& a, double& b)
{
double temp = a;
a = b;
b = temp;
} //模板技术
template<typename T>
void mySwap(T& t1, T& t2)
{
T temp = t1;
t1 = t2;
t2 = temp;
} void test01()
{
int a = ;
int b = ; //自动类型推导
mySwap(a, b); //显示指定类型
//mySwap<int>(a, b); cout << "a = " << a << endl;
cout << "b = " << b << endl;
} int main()
{
test01(); system("pause"); return ;
}

函数模板语法

#include <iostream>

using namespace std;

template<typename T>
void swapMy(T& t1, T& t2)
{
T temp = t1;
t1 = t2;
t2 = temp;
} void test01()
{
int a = ;
int b = ;
char c = 'c'; //自动类型推导,必须推导出一致的数据类型T才可以使用
//swapMy(a, c); //错误
swapMy(a, b); //正确
} template<typename T>
void func()
{
cout << "func()调用" << endl;
} void test02()
{
//模板必须要确定出T的数据类型才可以使用
func<int>();
} int main()
{
test01(); test02(); system("pause"); return ;
}

函数模板注意事项

#include <iostream>

using namespace std;

//利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序
//排序规则从大到小,排序算法为选择排序
//分别利用int数组和char数组进行测试 template<typename T>
void swapMy(T& t1, T& t2)
{
T temp = t1;
t1 = t2;
t2 = temp;
} template<typename T>
void sortMy(T arr[], int len)
{
for (int i = ; i < len; i++)
{
int max = i;
for (int j = i + ; j < len; j++)
{
if (arr[j] > arr[max])
{
max = j;
}
}
if (max != i)
{
swapMy(arr[max], arr[i]);
}
}
} template<typename T>
void printMy(T arr[], int len)
{
for (int i = ; i < len; i++)
{
cout << arr[i] << " ";
cout << endl;
}
} void test01()
{
int arr[] = { ,,,,,,,, };
int len = sizeof(arr) / sizeof(int);
sortMy(arr, len);
printMy(arr, len);
} void test02()
{
char arr[] = "abcdefg";
int len = sizeof(arr) / sizeof(char);
sortMy(arr, len);
printMy(arr, len);
} int main()
{
test01(); test02(); system("pause"); return ;
}

函数模板案例

#include <iostream>

using namespace std;

//普通函数调用时可以发生自动类型转换
//函数模板调用时,如果利用自动类型推导,不会发生自动类型转换
//如果利用显示指定类型的方式,可以发生自动类型转换 //普通函数
int myAdd01(int a, int b)
{
return a + b;
} //函数模板
template <typename T>
T myAdd02(T a, T b)
{
return a + b;
} void test01()
{
int a = ;
int b = ;
char c = 'c'; cout << myAdd01(a, c) << endl; //myAdd02(a, c); //错误 cout << myAdd02<int>(a, c) << endl;
} int main()
{
test01(); system("pause"); return ;
}

普通函数与函数模板的区别

#include <iostream>

using namespace std;

//如果函数模板和普通函数都可以实现,优先调用普通函数
//可以通过空模板参数列表来强制调用函数模板
//函数模板也可以发生重载
//如果函数模板可以产生更好的匹配,优先调用函数模板 //普通函数
void myPrint(int a, int b)
{
cout << "普通函数调用" << endl;
} //函数模板
template <typename T>
void myPrint(T a, T b)
{
cout << "函数模板调用" << endl;
} //重载函数模板
template <typename T>
void myPrint(T a, T b, T c)
{
cout << "重载函数模板调用" << endl;
} void test01()
{
int a = ;
int b = ;
int c = ; myPrint(a, b); //普通函数调用 myPrint<>(a, b); //函数模板调用 myPrint(a, b, c); //重载函数模板调用 char c1 = 'a';
char c2 = 'b';
myPrint(c1, c2); //函数模板调用
} int main()
{
test01(); system("pause"); return ;
}

普通函数与函数模板的调用规则

#include <iostream>

using namespace std;

//模板的通用性并不是万能的

//如果a和b传入的是数组,就无法实现了
template <typename T>
void t1(T a, T b)
{
a = b;
} //如果传入的是Preson自定义数据类型,也无法实现
template <typename T>
void t2(T a, T b)
{ if (a > b)
{ }
} //C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供 具体化 模板 class Preson
{
public:
string m_name;
int m_age;
public:
Preson(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
}; //普通函数模板
template <typename T>
bool myCompare(T& a, T& b)
{
if (a == b)
{
return true;
}
else
{
return false;
}
} //具体化模板
//具体化优先于常规模板
template<> bool myCompare(Preson& p1, Preson& p2)
{
if (p1.m_name == p2.m_name && p1.m_age == p2.m_age)
{
return true;
}
else
{
return false;
}
} void test01()
{
int a = ;
int b = ; //内置数据类型可以直接使用通用的函数模板
bool bl = myCompare(a, b);
if (bl)
{
cout << "a = b" << endl;
}
else
{
cout << "a != b" << endl;
}
} void test02()
{
Preson p1("张三", );
Preson p2("张三", ); //自定义数据类型,不会调用普通函数模板
//可以创建 具体化 Preson数据类型模板
bool bl = myCompare(p1, p2);
if (bl)
{
cout << "p1 = p2" << endl;
}
else
{
cout << "p1 != p2" << endl;
}
} int main()
{
test01(); test02(); system("pause"); return ;
}

模板的局限性

#include <iostream>

using namespace std;

template<class NameType, class AgeType>
class Preson
{
public:
NameType m_name;
AgeType m_age;
public:
Preson(NameType name, AgeType age)
{
this->m_name = name;
this->m_age = age;
}
void showPreson()
{
cout << "name = " << this->m_name << endl;
cout << "age = " << this->m_age << endl;
}
}; void test01()
{
Preson<string, int> p("张三", );
p.showPreson();
} int main()
{
test01(); system("pause"); return ;
}

类模板语法

#include <iostream>

using namespace std;

//类模板没有自动类型推导的使用方式
//类模板在模板参数列表中可以有默认参数 template<class NameType, class AgeType = int>
class Preson
{
public:
NameType m_name;
AgeType m_age;
public:
Preson(NameType name, AgeType age)
{
this->m_name = name;
this->m_age = age;
}
void showPreson()
{
cout << "name = " << this->m_name << endl;
cout << "age = " << this->m_age << endl;
}
}; void test01()
{ //Preson p1("张三", 20); //错误 Preson<string, int> p2("张三", );
p2.showPreson();
} void test02()
{
Preson<string> p("李四", );
p.showPreson();
} int main()
{
test01(); test02(); system("pause"); return ;
}

类模板与函数模板的区别

#include <iostream>

using namespace std;

//普通类中成员函数一开始就可以创建
//类模板中成员函数在调用时才创建 class Preson1
{
public:
void showPreson1()
{
cout << "showPreson1()函数调用" << endl;
}
}; class Preson2
{
public:
void showPreson2()
{
cout << "showPreson2()函数调用" << endl;
}
}; template<class T>
class myClass
{
public:
T t;
public:
void func1()
{
t.showPreson1();
}
void func2()
{
t.showPreson2();
}
}; void test01()
{
myClass<Preson1> mc;
mc.func1(); //错误,函数调用时才会创建成员函数
//mc.func2();
} int main()
{
test01(); system("pause"); return ;
}

类模板中成员函数创建时机

#include <iostream>

using namespace std;

//类模板实例化出的对象,向函数传参的方式
//一共有三种传递方式:
//指定传入的类型,直接显示对象的数据类型
//参数模板化,将对象中的参数变为模板进行传递
//整个类模板化,将这个对象类型模板化进行传递 //类模板
template<class NameType, class AgeType>
class Preson
{
public:
NameType m_name;
AgeType m_age;
public:
Preson(NameType name, AgeType age)
{
this->m_name = name;
this->m_age = age;
}
void showPreson()
{
cout << "name = " << this->m_name << endl;
cout << "age = " << this->m_age << endl;
}
}; //1、指定传入的类型
void printPreson1(Preson<string, int>& p)
{
p.showPreson();
}
void test01()
{
Preson<string, int>p("张三", );
printPreson1(p);
} //2、参数模板化
template<class T1, class T2>
void printPreson2(Preson<T1, T2>& p)
{
p.showPreson(); cout << "T1的类型为: " << typeid(T1).name() << endl;
cout << "T2的类型为: " << typeid(T2).name() << endl;
}
void test02()
{
Preson<string, int>p("李四", );
printPreson2(p);
} //3、整个类模板化
template<class T>
void printPreson3(T& p)
{
p.showPreson();
cout << "T的类型为: " << typeid(T).name() << endl;
}
void test03()
{
Preson<string, int>p("王五", );
printPreson3(p);
} int main()
{
test01();
test02();
test03(); system("pause"); return ;
}

类模板对象做函数参数

#include <iostream>

using namespace std;

//当子类继承的父类是一个模板时,子类在声明的时候,要指定出父类中T的类型
//如果不指定,编译器无法给子类分配内存
//如果想灵活指定出父类中T的类型,子类也需变为类模板 template<class T>
class Base
{
T t;
}; //class Son :public Base
//{
//
//}; class Son1 :public Base<int> //必须指定一个类型
{ };
void test01()
{
Son1 s1;
} template<class T1, class T2>
class Son2 :public Base<T2>
{
public:
Son2()
{
cout << typeid(T1).name() << endl;
cout << typeid(T2).name() << endl;
}
};
void test02()
{
Son2<string, int>s;
} int main()
{
test01(); test02(); system("pause"); return ;
}

类模板与继承

#include <iostream>

using namespace std;

template<class T1, class T2>
class Preson
{
public:
T1 m_name;
T2 m_age;
public:
Preson(T1 name, T2 age);
void showPreson();
}; //构造函数类外实现
template<class T1, class T2>
Preson<T1, T2>::Preson(T1 name, T2 age)
{
this->m_name = name;
this->m_age = age;
} //成员函数类外实现
template<class T1, class T2>
void Preson<T1, T2>::showPreson()
{
cout << "name = " << this->m_name << endl;
cout << "age = " << this->m_age << endl;
} void test01()
{
Preson<string, int>p("张三", );
p.showPreson();
} int main()
{
test01(); system("pause"); return ;
}

类模板成员函数类外实现

#pragma once

#include<iostream>

using namespace std;

//类模板分文件编写出现的问题:
//类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到 //解决方法:
//直接包含.cpp源文件
//将声明和实现写在一个文件中,并更改文件后缀名为.hpp template<class T1, class T2>
class Preson
{
public:
T1 m_name;
T2 m_age;
public:
Preson(T1 name, T2 age);
void showPreson();
}; template<class T1, class T2>
Preson<T1, T2>::Preson(T1 name, T2 age)
{
this->m_name = name;
this->m_age = age;
} template<class T1, class T2>
void Preson<T1, T2>::showPreson()
{
cout << "name = " << this->m_name << endl;
cout << "age = " << this->m_age << endl;
}

类模板分文件编写(.hpp)

#include <iostream>

using namespace std;

#include "Preson.hpp"

void test01()
{
Preson<string, int>p("张三", );
p.showPreson();
} int main()
{
test01(); system("pause"); return ;
}

类模板分文件编写(.cpp)

#include <iostream>

using namespace std;

//全局函数类内实现,直接在类内声明友元即可
//全局函数类外实现,需要让编译器提前知道全局函数的存在 //
template <class T1, class T2>
class Preson; //
template <class T1, class T2>
void printPreson2(Preson<T1, T2>& p)
{
cout << "类外name = " << p.m_name << endl;
cout << "类外age = " << p.m_age << endl;
} template <class T1, class T2>
class Preson
{
//全局函数配合友元,类内实现
friend void printPreson1(Preson<T1, T2>& p)
{
cout << "name = " << p.m_name << endl;
cout << "age = " << p.m_age << endl;
} //全局函数配合友元,类外实现
friend void printPreson2<>(Preson<T1, T2>& p); private:
T1 m_name;
T2 m_age;
public:
Preson(T1 name, T2 age)
{
this->m_name = name;
this->m_age = age;
}
}; void test01()
{
Preson<string, int>p("David", );
printPreson1(p);
} void test02()
{
Preson<string, int>p("Alice", );
printPreson2(p);
} int main()
{
test01(); test02(); system("pause"); return ;
}

类模板与友元

#include <iostream>

#include<vector>

#include<algorithm>

using namespace std;

//C++面向对象和泛型编程,目的就是代码复用性的提升
//为建立数据结构和算法的一套标准,诞生了STL标准模板库
//Standard Template Library //STL大体上分为,容器、算法、迭代器、仿函数、适配器、空间配置器
//STL广义上分为,容器、算法、迭代器,容器和算法通过迭代器进行无缝连接 //容器,置物之所也,13254
//序列式容器,强调值排序,序列式容器中的每个元素均有固定位置,13254
//关联式容器,二叉树结构,元素之间没有严格的物理上的顺序关系,12345 //算法,问题之解法也
//质变算法,指运算过程中会更改区间内的元素内容,如拷贝、替换、删除等
//非质变算法,指运算过程中不会更改区间内的元素内容,如查找、计数、遍历、寻极值等 //迭代器,容器和算法之间的粘合剂
//每个容器都有自己的专属迭代器,迭代器的使用非常类似于指针 //回调函数
void myPrint(int n)
{
cout << n << endl;
} void test01()
{
//创建容器对象
vector<int> v; //向容器中存放数据
v.push_back();
v.push_back();
v.push_back();
v.push_back(); //迭代器指向容器中第一个元素
vector<int>::iterator pBegin = v.begin();
//迭代器指向容器中最后一个元素的下一位置
vector<int>::iterator pEnd = v.end(); //第一种遍历方式
while (pBegin != pEnd)
{
cout << *pBegin << endl;
pBegin++;
} //第二种遍历方式
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
//*it = < >
cout << *it << endl;
} //第三种遍历方式
for_each(v.begin(), v.end(), myPrint);
} //vector<>存放自定义数据类型
class Preson
{
public:
string m_name;
int m_age;
public:
Preson(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
}; void test02()
{
vector<Preson> v; Preson p1("aaa", );
Preson p2("bbb", );
Preson p3("ccc", );
Preson p4("ddd", );
Preson p5("eee", ); v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5); for (vector<Preson>::iterator it = v.begin(); it != v.end(); it++)
{
cout << "姓名 = " << (*it).m_name << endl;
cout << "年龄 = " << (*it).m_age << endl;
}
} void test03()
{
vector<Preson*> v; Preson p1("aaa", );
Preson p2("bbb", );
Preson p3("ccc", );
Preson p4("ddd", );
Preson p5("eee", ); v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5); for (vector<Preson*>::iterator it = v.begin(); it != v.end(); it++)
{
cout << "&姓名 = " << (*it)->m_name << endl;
cout << "&年龄 = " << (*it)->m_age << endl;
}
} //容器嵌套容器
void test04()
{
vector<vector<int>> v; vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4; for (int i = ; i < ; i++)
{
v1.push_back(i + );
v2.push_back(i + );
v3.push_back(i + );
v4.push_back(i + );
} v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4); for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
{
for (vector<int>::iterator it1 = (*it).begin(); it1 != (*it).end(); it1++)
{
cout << *it1 << " ";
}
cout << endl;
}
} int main()
{
test01(); test02(); test03(); test04(); system("pause"); return ;
}

STL初识

#include <iostream>

using namespace std;

//string构造函数
void test01()
{
string s1;
cout << "s1 = " << s1 << endl; const char* c = "hello world";
string s2(c);
cout << "s2 = " << s2 << endl; string s3(s2);
cout << "s3 = " << s3 << endl; string s4(, 'a');
cout << "s4 = " << s4 << endl;
} //string字符串赋值操作
void test02()
{
string s1;
s1 = "hello world";
cout << "s1 = " << s1 << endl; string s2;
s2 = s1;
cout << "s2 = " << s2 << endl; string s3;
s3 = 'a';
cout << "s3 = " << s3 << endl; string s4;
s4.assign("hello c++");
cout << "s4 = " << s4 << endl; string s5;
s5.assign("hello c++", );
cout << "s5 = " << s5 << endl; string s6;
s6.assign(s5);
cout << "s6 = " << s6 << endl; string s7;
s7.assign(, 'x');
cout << "s7 = " << s7 << endl;
} //string字符串拼接操作
void test03()
{
string s1 = "我"; s1 += "爱玩游戏";
cout << "s1 = " << s1 << endl; s1 += ':';
cout << "s1 = " << s1 << endl; string s2 = "lol dnf";
s1 += s2;
cout << "s1 = " << s1 << endl; string s3 = "i";
s3.append("love");
s3.append("game abc", );
s3.append(s2, , );
cout << "s3 = " << s3 << endl;
} //string字符串查找和替换
void test04()
{
string s1 = "abcdefgde"; int n = s1.find("de"); if (n == -)
{
cout << "no find" << endl;
}
else
{
cout << "n = " << n << endl;
} n = s1.rfind("de");
cout << "n = " << n << endl; string s2 = "abcdefgde";
s2.replace(, , "");
cout << "s2 = " << s2 << endl;
} //string字符串比较大小
void test05()
{
string s1 = "hello";
string s2 = "aello"; int n = s1.compare(s2); if (n == )
{
cout << "s1 = s2" << endl;
}
else if (n > )
{
cout << "s1 > s2" << endl;
}
else
{
cout << "s1 < s2" << endl;
}
} //string字符串存取
void test06()
{
string s1 = "hello world"; for (int i = ; i < s1.size(); i++)
{
cout << s1[i] << " ";
}
cout << endl; for (int i = ; i < s1.size(); i++)
{
cout << s1.at(i) << " ";
}
cout << endl; s1[] = 'a';
s1.at() = 'b';
cout << "s1 = " << s1 << endl;
} //string字符串插入和删除
void test07()
{
string s1 = "hello"; s1.insert(, "");
cout << "s1 = " << s1 << endl; s1.erase(, );
cout << "s1 = " << s1 << endl;
} //string字符串截取
void test08()
{
string s1 = "abcdefg";
string substr = s1.substr(, );
cout << "sunstr = " << substr << endl; string s2 = "alice@qq.com";
int n = s2.find("@");
string name = s2.substr(, n);
cout << "name = " << name << endl;
} int main()
{
test01(); test02(); test03(); test04(); test05(); test06(); test07(); test08(); system("pause"); return ;
}

string容器

#include <iostream>

#include<vector>

using namespace std;

//vector数据结构和数组非常相似,也称为单端数组
//不同之处在于数组是静态空间,而vector可以动态扩展
//所谓动态扩展,即找到更大的新的内存空间,然后将数据拷贝至新空间并释放原空间 void printVector(vector<int>& v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} //vector构造函数
void test01()
{
vector<int> v1;
for (int i = ; i < ; i++)
{
v1.push_back(i);
}
printVector(v1); vector<int> v2(v1.begin(), v1.end());
printVector(v2); vector<int> v3(, );
printVector(v3); vector<int> v4(v3);
printVector(v4);
} //vector赋值操作
void test02()
{
vector<int> v1;
for (int i = ; i < ; 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(, );
printVector(v4);
} //vector容量和大小
void test03()
{
vector<int> v1;
for (int i = ; i < ; 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;
} v1.resize(, );
printVector(v1); v1.resize();
printVector(v1);
} //vector插入和删除
void test04()
{
vector<int> v1; //尾插
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
printVector(v1); //尾删
v1.pop_back();
printVector(v1); //插入
v1.insert(v1.begin(), );
printVector(v1);
v1.insert(v1.begin(), , );
printVector(v1); //删除
v1.erase(v1.begin());
printVector(v1); //清空
v1.erase(v1.begin(), v1.end());
v1.clear();
printVector(v1);
} //vector数据存取
void test05()
{
vector<int> v1;
for (int i = ; i < ; i++)
{
v1.push_back(i);
} for (int i = ; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl; for (int i = ; i < v1.size(); i++)
{
cout << v1.at(i) << " ";
}
cout << endl; cout << "v1第一个元素 = " << v1.front() << endl;
cout << "v1最后一个元素 = " << v1.back() << endl;
} //vector互换容器
void test06()
{
vector<int> v1;
for (int i = ; i < ; i++)
{
v1.push_back(i);
}
printVector(v1); vector<int> v2;
for (int i = ; i > ; i--)
{
v2.push_back(i);
}
printVector(v2); //互换容器
cout << "互换后" << endl;
v1.swap(v2);
printVector(v1);
printVector(v2); vector<int> v3;
for (int i = ; i < ; i++)
{
v3.push_back(i);
}
cout << "v3容量 = " << v3.capacity() << endl;
cout << "v3大小 = " << v3.size() << endl;
v3.resize();
cout << "v3容量 = " << v3.capacity() << endl;
cout << "v3大小 = " << v3.size() << endl;
//收缩内存
vector<int>(v3).swap(v3);
cout << "v3容量 = " << v3.capacity() << endl;
cout << "v3大小 = " << v3.size() << endl;
} //vector预留空间
void test07()
{
vector<int> v1; v1.reserve(); int num = ; int* p = NULL; for (int i = ; i < ; i++)
{
v1.push_back(i);
if (p != &v1[])
{
p = &v1[];
num++;
}
}
cout << "num = " << num << endl;
} int main()
{
test01(); test02(); test03(); test04(); test05(); test06(); test07(); system("pause"); return ;
}

vetcor容器

#include <iostream>

#include<deque>

#include<algorithm>

using namespace std;

//双端数组,可以对头端进行插入删除操作

void printDeque(const deque<int>& d)
{
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} //deque构造函数
void test01()
{
deque<int> d1;
for (int i = ; i < ; i++)
{
d1.push_back(i);
}
printDeque(d1); deque<int> d2(d1.begin(), d1.end());
printDeque(d2); deque<int> d3(, );
printDeque(d3); deque<int> d4(d3);
printDeque(d4);
} //deque赋值操作
void test02()
{
deque<int> d1;
for (int i = ; i < ; i++)
{
d1.push_back(i);
}
printDeque(d1); deque<int> d2;
d2 = d1;
printDeque(d2); deque<int> d3;
d3.assign(d1.begin(), d1.end());
printDeque(d3); deque<int> d4;
d4.assign(, );
printDeque(d4);
} //deque大小
void test03()
{
deque<int> d1;
for (int i = ; i < ; i++)
{
d1.push_back(i);
}
printDeque(d1); if (d1.empty())
{
cout << "d1空" << endl;
}
else
{
cout << "d1不空" << endl;
cout << "d1大小 = " << d1.size() << endl;
} d1.resize(, );
printDeque(d1); d1.resize();
printDeque(d1);
} //deque插入和删除
void test04()
{
deque<int> d1; //尾插
d1.push_back();
d1.push_back();
//头插
d1.push_front();
d1.push_front();
printDeque(d1); //尾删
d1.pop_back();
//头删
d1.pop_front();
printDeque(d1); //插入
d1.insert(d1.begin(), );
printDeque(d1); d1.insert(d1.begin(), , );
printDeque(d1); deque<int> d2;
d2.push_back();
d2.push_back();
d2.push_back();
d1.insert(d1.begin(), d2.begin(), d2.end());
printDeque(d1); //删除
d1.erase(d1.begin());
printDeque(d1); //清空
d1.erase(d1.begin(), d1.end());
d1.clear();
printDeque(d1);
} //deque数据存取
void test05()
{
deque<int> d1; d1.push_back();
d1.push_back();
d1.push_front();
d1.push_front(); for (int i = ; i < d1.size(); i++)
{
cout << d1[i] << " ";
}
cout << endl; for (int i = ; i < d1.size(); i++)
{
cout << d1.at(i) << " ";
}
cout << endl; cout << "d1第一个元素 = " << d1.front() << endl;
cout << "d1最后一个元素 = " << d1.back() << endl;
} //deque排序
void test06()
{
deque<int> d1; d1.push_back();
d1.push_back();
d1.push_front();
d1.push_front(); printDeque(d1); sort(d1.begin(), d1.end());
printDeque(d1);
} int main()
{
test01(); test02(); test03(); test04(); test05(); test06(); system("pause"); return ;
}

deque容器

#include <iostream>

#include<vector>

#include<deque>

#include<algorithm>

#include<time.h>

using namespace std;

//有五名选手ABCDE,十个评委分别对其打分
//去除最高分和最低分,求平均分 class Preson
{
public:
string m_name;
int m_score;
public:
Preson(string name, int score)
{
this->m_name = name;
this->m_score = score;
}
}; void createPreson(vector<Preson>& v)
{
string nameAll = "ABCDE";
for (int i = ; i < ; i++)
{
string name = "选手";
name += nameAll[i];
int score = ;
Preson p(name, score);
v.push_back(p);
}
} void setScore(vector<Preson>& v)
{
for (vector<Preson>::iterator it = v.begin(); it != v.end(); it++)
{
deque<int> d;
for (int i = ; i < ; i++)
{
int score = rand() % + ;
d.push_back(score);
} cout << "选手:" << it->m_name << " 打分:" << it->m_score;
for (deque<int>::iterator dit = d.begin(); dit != d.end(); dit++)
{
cout << *dit << " ";
}
cout << endl; sort(d.begin(), d.end());
d.pop_back();
d.pop_front();
int sum = ;
for (deque<int>::iterator dit = d.begin(); dit != d.end(); dit++)
{
sum += *dit;
}
int avg = sum / d.size();
it->m_score = avg;
}
} void showScore(vector<Preson>& v)
{
for (vector<Preson>::iterator it = v.begin(); it != v.end(); it++)
{
cout << "姓名 = " << it->m_name << "分数 = " << it->m_score << endl;
}
} int main()
{
srand((unsigned int)time(NULL)); vector<Preson> v; createPreson(v); setScore(v); showScore(v); system("pause"); return ;
}

案例(评委打分)

#include <iostream>

#include<stack>

using namespace std;

//stack是一种先进后出的数据结构,它只有一个出口
//栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
//栈中进入数据称为入栈(push)
//栈中弹出数据称为出栈(pop)
//生活中的栈:弹夹里面的子弹,地铁中的乘客 void test01()
{
stack<int> s; s.push();
s.push();
s.push(); while (!s.empty())
{
cout << "栈顶元素为 = " << s.top() << endl;
s.pop();
} cout << "栈的大小 = " << s.size() << endl;
} int main()
{
test01(); system("pause"); return ;
}

stack容器

#include <iostream>

#include<queue>

using namespace std;

//queue是一种先进先出的数据结构,它有两个出口
//队列容器允许从一端新增元素,从另一端移除元素
//队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
//队列中入数据称为入队(push)
//队列中出数据称为出队(pop)
//生活中的队列:如排队打饭 class Preson
{
public:
string m_name;
int m_age;
public:
Preson(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
}; void test01()
{
queue<Preson> q; Preson p1("唐僧", );
Preson p2("孙悟空", );
Preson p3("猪八戒", );
Preson p4("沙师弟", ); q.push(p1);
q.push(p2);
q.push(p3);
q.push(p4); //队列不提供迭代器,更不支持随机访问
while (!q.empty())
{
cout << "队头元素(姓名) = " << q.front().m_name << " 队头元素(年龄) = " << q.front().m_age << endl; cout << "队尾元素(姓名) = " << q.back().m_name << " 队尾元素(年龄) = " << q.back().m_age << endl; cout << endl; q.pop();
} cout << "队列大小 = " << q.size() << endl;
} int main()
{
test01(); system("pause"); return ;
}

queue容器

#include <iostream>

#include<list>

using namespace std;

//将数据进行链式存储
//链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
//链表的组成:链表由一系列节点组成
//STL中的链表是一个双向循环链表
//由于链表的存储方式并不是连续的内存空间,因此链表(list)中的迭代器只支持前移和后移,属于双向迭代器
//list优点:
//采用动态存储分配,不会造成内存浪费和溢出
//链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
//list缺点:
//链表灵活,但空间(指针域)和时间(遍历)额外耗费巨大
//list插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的 void printList(const list<int>& l)
{
for (list<int>::const_iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} //list构造函数
void test01()
{
list<int> l1; l1.push_back();
l1.push_back();
l1.push_back();
l1.push_back();
printList(l1); list<int> l2(l1.begin(), l1.end());
printList(l2); list<int> l3(l2);
printList(l3); list<int> l4(, );
printList(l4);
} //list赋值和交换
void test02()
{
list<int> l1; l1.push_back();
l1.push_back();
l1.push_back();
l1.push_back();
printList(l1); //赋值
list<int> l2;
l2 = l1;
printList(l2); list<int> l3;
l3.assign(l2.begin(), l2.end());
printList(l3); list<int> l4;
l4.assign(, );
printList(l4); //交换
list<int> l5; l5.push_back();
l5.push_back();
l5.push_back();
l5.push_back(); cout << "交换前:" << endl;
printList(l1);
printList(l5);
cout << "----------" << endl;
l1.swap(l5);
cout << "交换后:" << endl;
printList(l1);
printList(l5);
} //list大小
void test03()
{
list<int> l1; l1.push_back();
l1.push_back();
l1.push_back();
l1.push_back(); if (l1.empty())
{
cout << "l1为空" << endl;
}
else
{
cout << "l1不为空" << endl;
cout << "l1大小 = " << l1.size() << endl;
} l1.resize();
printList(l1); l1.resize();
printList(l1);
} //list插入和删除
void test04()
{
list<int> l1; //尾插
l1.push_back();
l1.push_back();
l1.push_back(); //头插
l1.push_front();
l1.push_front();
l1.push_front(); printList(l1); //插入
list<int>::iterator it = l1.begin();
l1.insert(++it, );
printList(l1); //移除
it = l1.begin();
l1.erase(++it);
printList(l1); //移除
l1.push_back();
l1.push_back();
l1.push_back();
l1.push_back();
printList(l1);
l1.remove();
printList(l1); //清空
l1.clear();
printList(l1);
} //list数据存取
void test05()
{
list<int> l1; l1.push_back();
l1.push_back();
l1.push_back();
l1.push_back(); cout << "第一个元素 = " << l1.front() << endl;
cout << "最后一个元素 = " << l1.back() << endl; //list容器中不支持通过[]和at方式访问数据
//list容器的迭代器是双向迭代器,不支持随机访问
//list<int>::iterator it = l1.begin();
//it = it + 1;
} bool myCompare(int n1, int n2)
{
return n1 > n2;
} //list反转和排序
void test06()
{
list<int> l1; l1.push_back();
l1.push_back();
l1.push_back();
l1.push_back();
printList(l1); //反转
l1.reverse();
printList(l1); //排序
//默认排序
l1.sort();
printList(l1);
//自定义排序
l1.sort(myCompare);
printList(l1);
} class Preson
{
public:
string m_name;
int m_age;
int m_height;
public:
Preson(string name, int age, int height)
{
this->m_name = name;
this->m_age = age;
this->m_height = height;
}
}; bool comparePreson(Preson& p1, Preson& p2)
{
if (p1.m_age == p2.m_age)
{
return p1.m_height > p2.m_height;
}
else
{
return p1.m_age < p2.m_age;
}
} void test07()
{
//将Preson自定义数据类型进行排序
//Preson属性中有姓名、年龄、身高
//按照年龄升序,年龄相同时身高降序排列 list<Preson> l1; Preson p1("刘备", , );
Preson p2("曹操", , );
Preson p3("孙权", , );
Preson p4("赵云", , );
Preson p5("关羽", , );
Preson p6("张飞", , ); l1.push_back(p1);
l1.push_back(p2);
l1.push_back(p3);
l1.push_back(p4);
l1.push_back(p5);
l1.push_back(p6); for (list<Preson>::iterator it = l1.begin(); it != l1.end(); it++)
{
cout << "姓名 = " << it->m_name << " 年龄 = " << it->m_age << " 身高 = " << it->m_height << endl;
} l1.sort(comparePreson);
cout << "排序后" << endl; for (list<Preson>::iterator it = l1.begin(); it != l1.end(); it++)
{
cout << "姓名 = " << it->m_name << " 年龄 = " << it->m_age << " 身高 = " << it->m_height << endl;
}
} int main()
{
test01(); test02(); test03(); test04(); test05(); test06(); test07(); system("pause"); return ;
}

list容器

#include <iostream>

#include<set>

using namespace std;

//所有元素都会在插入时被自动排序
//set/multiset属于关联式容器,底层结构是用二叉树实现
//set/multiset区别:set容器中不允许有重复的元素,multiset容器中允许有重复的元素 void printSet(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} //set构造和赋值
void test01()
{
set<int> s1; s1.insert();
s1.insert();
s1.insert();
s1.insert();
printSet(s1); //拷贝构造
set<int> s2(s1);
printSet(s2); //赋值
set<int> s3;
s3 = s2;
printSet(s3);
} //set大小和交换
void test02()
{
set<int> s1;
s1.insert();
s1.insert();
s1.insert();
s1.insert(); //大小
if (s1.empty())
{
cout << "s1为空" << endl;
}
else
{
cout << "s1不为空" << endl;
cout << "s1大小 = " << s1.size() << endl;
} //交换
set<int> s2;
s2.insert();
s2.insert();
s2.insert();
s2.insert(); cout << "交换前" << endl;
printSet(s1);
printSet(s2);
s1.swap(s2);
cout << "交换后" << endl;
printSet(s1);
printSet(s2);
} //set插入和删除
void test03()
{
set<int> s1; //插入
s1.insert();
s1.insert();
s1.insert();
s1.insert();
printSet(s1); //删除
s1.erase(s1.begin());
printSet(s1);
s1.erase();
printSet(s1); //清空
s1.erase(s1.begin(), s1.end());
//s1.clear();
printSet(s1);
} //set查找和统计
void test04()
{
set<int> s1;
s1.insert();
s1.insert();
s1.insert();
s1.insert(); //查找
set<int>::iterator pos = s1.find();
if (pos != s1.end())
{
cout << "找到元素 = " << *pos << endl;
}
else
{
cout << "未找到元素" << endl;
} //统计
int num = s1.count();
cout << "num = " << num << endl;
} //set/multiset区别
//set不可以插入重复数据
//set插入数据的同时会返回插入结果,表示插入是否成功
void test05()
{
set<int> s1;
pair<set<int>::iterator, bool> ret = s1.insert();
if (ret.second)
{
cout << "第一次插入成功" << endl;
}
else
{
cout << "第一次插入失败" << endl;
}
ret = s1.insert();
if (ret.second)
{
cout << "第二次插入成功" << endl;
}
else
{
cout << "第二次插入失败" << endl;
} multiset<int> ms1;
ms1.insert();
ms1.insert();
for (multiset<int>::iterator it = ms1.begin(); it != ms1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} //pair对组创建
//成对出现的数据,利用对组可以返回两个数据
void test06()
{
pair<string, int> p1(string("tom"), );
cout << "姓名 = " << p1.first << " 年龄 = " << p1.second << endl; pair<string, int> p2 = make_pair("alice", );
cout << "姓名 = " << p2.first << " 年龄 = " << p2.second << endl;
} class myCompare6
{
public:
bool operator()(int n1, int n2) const
{
return n1 > n2;
}
}; class Preson
{
public:
string m_name;
int m_age;
public:
Preson(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
}; class comparePreson
{
public:
bool operator()(const Preson& p1, const Preson& p2) const
{
return p1.m_age > p2.m_age;
}
}; //set容器排序
//默认排序规则为从小到大
//利用仿函数可以改变排序规则
void test07()
{
set<int> s1;
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert();
//默认排序规则从小到大
for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
{
cout << *it << " ";
}
cout << endl; set<int, myCompare6> s2;
s2.insert();
s2.insert();
s2.insert();
s2.insert();
s2.insert();
//改变排序规则
for (set<int, myCompare6>::iterator it = s2.begin(); it != s2.end(); it++)
{
cout << *it << " ";
}
cout << endl; set<Preson, comparePreson> s3;
Preson p1("刘备", );
Preson p2("关羽", );
Preson p3("张飞", );
Preson p4("马超", );
s3.insert(p1);
s3.insert(p2);
s3.insert(p3);
s3.insert(p4);
//自定义数据类型改变排序规则
for (set<Preson, comparePreson>::iterator it = s3.begin(); it != s3.end(); it++)
{
cout << "姓名 = " << it->m_name << " 年龄 = " << it->m_age << endl;
}
} int main()
{
test01(); test02(); test03(); test04(); test05(); test06(); test07(); system("pause"); return ;
}

set容器

#include <iostream>

#include<map>

using namespace std;

//map中所有元素都是pair
//pair中第一个元素为key(键值),起到索引作用
//pair中第二个元素为value(实值)
//所有元素都会根据元素的键值自动排序
//map/multimap属于关联式容器,底层结构是用二叉树实现
//优点:可以根据key值快速找到value值
//map/multimap区别:
//map容器中不允许有重复的key值元素
//multimap容器中允许有重复的key值元素 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;
} //map构造和赋值
void test01()
{
//默认构造
map<int, int> m1;
m1.insert(pair<int, int>(, ));
m1.insert(pair<int, int>(, ));
m1.insert(pair<int, int>(, ));
printMap(m1); //拷贝构造
map<int, int> m2(m1);
printMap(m2); //赋值
map<int, int> m3;
m3 = m2;
printMap(m3);
} //map大小和交换
void test02()
{
map<int, int> m1; m1.insert(pair<int, int>(, ));
m1.insert(pair<int, int>(, ));
m1.insert(pair<int, int>(, )); //大小
if (m1.empty())
{
cout << "m1为空" << endl;
}
else
{
cout << "m1不为空" << endl;
cout << "m1大小 = " << m1.size() << endl;
} //交换
map<int, int> m2;
m2.insert(pair<int, int>(, ));
m2.insert(pair<int, int>(, ));
m2.insert(pair<int, int>(, ));
cout << "交换前:" << endl;
printMap(m1);
printMap(m2);
cout << "交换后:" << endl;
m1.swap(m2);
printMap(m1);
printMap(m2);
} //map插入和删除
void test03()
{
map<int, int> m1; //插入
m1.insert(pair<int, int>(, ));
m1.insert(make_pair(, ));
m1.insert(map<int, int>::value_type(, ));
m1[] = ;
printMap(m1); //删除
m1.erase(m1.begin());
printMap(m1);
m1.erase();
printMap(m1); //清空
m1.erase(m1.begin(), m1.end());
//m1.clear();
printMap(m1);
} //map查找和统计
void test04()
{
map<int, int> m1; m1.insert(pair<int, int>(, ));
m1.insert(pair<int, int>(, ));
m1.insert(pair<int, int>(, )); //查找
map<int, int>::iterator pos = m1.find();
if (pos != m1.end())
{
cout << "找到元素 key = " << (*pos).first << " value = " << (*pos).second << endl;
}
else
{
cout << "未找到元素" << endl;
} //统计
int num = m1.count();
cout << "num = " << num << endl;
} class myCompare
{
public:
bool operator()(int n1, int n2) const
{
return n1 > n2;
}
}; //map排序
void test05()
{
map<int, int, myCompare> m1; m1.insert(make_pair(, ));
m1.insert(make_pair(, ));
m1.insert(make_pair(, ));
m1.insert(make_pair(, ));
m1.insert(make_pair(, )); for (map<int, int, myCompare>::iterator it = m1.begin(); it != m1.end(); it++)
{
cout << "key = " << it->first << " value = " << it->second << endl;
}
} int main()
{
test01(); test02(); test03(); test04(); test05(); system("pause"); return ;
}

map容器

#include <iostream>

using namespace std;

//函数对象概念:
//重载函数调用操作符的类,其对象常称为函数对象
//函数对象使用重载的()时,行为类似函数调用,也称仿函数
//函数对象(仿函数)是一个类,不是一个函数 class myAdd
{
public:
int operator()(int n1, int n2)
{
return n1 + n2;
}
}; //函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
void test01()
{
myAdd ma;
cout << ma(, ) << endl;
} class myPrint
{
public:
int count;
public:
myPrint()
{
count = ;
}
void operator()(string s)
{
cout << s << endl;
count++;
}
}; //函数对象超出普通函数的概念,函数对象可以有自己的状态
void test02()
{
myPrint my;
my("hello world");
my("hello world");
my("hello world");
my("hello world");
my("hello world");
cout << "hello world调用次数 = " << my.count << endl;
} void doPrint(myPrint& mp, string s)
{
mp(s);
} //函数对象可以作为参数传递
void test03()
{
myPrint mp;
doPrint(mp, "hello c++");
} int main()
{
test01(); test02(); test03(); system("pause"); return ;
}

函数对象

#include <iostream>

#include<vector>

#include<algorithm>

using namespace std;

//返回bool类型的仿函数称为谓词
//如果operator()接受一个参数,那么叫做一元谓词
//如果operator()接受两个参数,那么叫做二元谓词 //一元谓词
class greateFive
{
public:
bool operator()(int n)
{
return n > ;
}
}; void test01()
{
vector<int> v;
for (int i = ; i < ; i++)
{
v.push_back(i);
}
vector<int>::iterator it = find_if(v.begin(), v.end(), greateFive());
if (it == v.end())
{
cout << "未找到" << endl;
}
else
{
cout << "找到 = " << *it << endl;
}
} //二元谓词
class myCompare
{
public:
int operator()(int n1, int n2)
{
return n1 > n2;
}
}; void test02()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
//默认排序
sort(v.begin(), v.begin());
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
cout << endl;
}
cout << "----------" << endl;
//自定义排序
sort(v.begin(), v.end(), myCompare());
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
cout << endl;
}
} int main()
{
test01(); test02(); system("pause"); return ;
}

谓词

#include <iostream>

#include<vector>

#include<functional>

#include<algorithm>

using namespace std;

//算数仿函数
//实现四则运算
//negate是一元运算,其余为二元运算
//加法仿函数(plus)
//减法仿函数(minus)
//乘法仿函数(multiplies)
//除法仿函数(divides)
//取模反函数(modulus)
//取反仿函数(negate)
void test01()
{
negate<int> n;
cout << n() << endl; plus<int> p;
cout << p(, ) << endl;
} class myCompare
{
public:
bool operator()(int n1, int n2)
{
return n1 > n2;
}
}; //关系仿函数
//实现关系对比
//等于(equal_to)
//不等于(not_equal_to)
//大于(greater)
//大于等于(greater_equal)
//小于(less)
//小于等于(less_equal)
void test02()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl; //自己实现仿函数
//sort(v.begin(), v.end(), myCompare()); //STL内建仿函数
sort(v.begin(), v.end(), greater<int>());
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} //逻辑仿函数
//实现逻辑运算
//逻辑与(logical_and)
//逻辑或(logical_or)
//逻辑非(logical_not)
void test03()
{
vector<bool> v1;
v1.push_back(true);
v1.push_back(false);
v1.push_back(true);
v1.push_back(false);
for (vector<bool>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << " ";
}
cout << endl; vector<bool> v2;
v2.resize(v1.size());
transform(v1.begin(), v1.end(), v2.begin(), logical_not<bool>());
for (vector<bool>::iterator it = v2.begin(); it != v2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} int main()
{
test01(); test02(); test03(); system("pause"); return ;
}

内建函数对象

#include <iostream>

#include<vector>

#include<algorithm>

using namespace std;

//普通函数
void print01(int n)
{
cout << n << " ";
} //函数对象
class print02
{
public:
void operator()(int n)
{
cout << n << " ";
}
}; void test01()
{
vector<int> v;
for (int i = ; i < ; i++)
{
v.push_back(i);
} //遍历算法
for_each(v.begin(), v.end(), print01);
cout << endl;
for_each(v.begin(), v.end(), print02());
cout << endl;
} class transForm
{
public:
int operator()(int n)
{
return n;
}
}; class myPrint
{
public:
void operator()(int n)
{
cout << n << " ";
}
}; void test02()
{
vector<int> v;
for (int i = ; i < ; i++)
{
v.push_back(i);
} vector<int> vTarget;
vTarget.resize(v.size());
//搬运算法
transform(v.begin(), v.end(), vTarget.begin(), transForm());
for_each(vTarget.begin(), vTarget.end(), myPrint());
cout << endl;
} int main()
{
test01(); test02(); system("pause"); return ;
}

常用遍历算法

#include <iostream>

#include<vector>

#include<algorithm>

using namespace std;

//查找指定元素(find)
//按条件查找指定元素(find_if)
//查找相邻重复元素(adjacent_find)
//二分查找法(binary_search)
//统计元素个数(count)
//按条件统计元素个数(count_if) //find
void test01()
{
vector<int> v;
for (int i = ; i < ; i++)
{
v.push_back(i + );
}
vector<int>::iterator it = find(v.begin(), v.end(), );
if (it == v.end())
{
cout << "未找到" << endl;
}
else
{
cout << "找到 = " << *it << endl;
}
}
class Preson
{
public:
string m_name;
int m_age;
public:
Preson(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
bool operator==(const Preson& p)
{
if (this->m_name == p.m_name && this->m_age == p.m_age)
{
return true;
}
return false;
}
};
void test02()
{
vector<Preson> v;
Preson p1("aaa", );
Preson p2("bbb", );
Preson p3("ccc", );
Preson p4("ddd", );
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
vector<Preson>::iterator it = find(v.begin(), v.end(), p2);
if (it == v.end())
{
cout << "未找到" << endl;
}
else
{
cout << "姓名 = " << it->m_name << " 年龄 = " << it->m_age << endl;
}
} //find_if
//内置数据类型
class greateFive
{
public:
bool operator()(int n)
{
return n > ;
}
};
void test03()
{
vector<int> v;
for (int i = ; i < ; i++)
{
v.push_back(i + );
}
vector<int>::iterator it = find_if(v.begin(), v.end(), greateFive());
if (it == v.end())
{
cout << "未找到" << endl;
}
else
{
cout << "找到 = " << *it << endl;
}
}
//自定义数据类型
class comparePreson
{
public:
bool operator()(Preson& p)
{
return p.m_age > ;
}
};
void test04()
{
vector<Preson> v;
Preson p1("aaa", );
Preson p2("bbb", );
Preson p3("ccc", );
Preson p4("ddd", );
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
vector<Preson>::iterator it = find_if(v.begin(), v.end(), comparePreson());
if (it == v.end())
{
cout << "未找到" << endl;
}
else
{
cout << "姓名 = " << it->m_name << " 年龄 = " << it->m_age << endl;
}
} //adjacent_find
void test05()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
vector<int>::iterator it = adjacent_find(v.begin(), v.end());
if (it == v.end())
{
cout << "未找到" << endl;
}
else
{
cout << "找到相邻重复元素 = " << *it << endl;
}
} //binary_search
//无序序列中不可使用
void test06()
{
vector<int> v;
for (int i = ; i < ; i++)
{
v.push_back(i);
}
bool b = binary_search(v.begin(), v.end(), );
if (b)
{
cout << "找到" << endl;
}
else
{
cout << "未找到" << endl;
}
} //count
void test07()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
int num = count(v.begin(), v.end(), );
cout << "4的个数为:" << num << endl;
} //count_if
//内置数据类型
class greateFour
{
public:
bool operator()(int n)
{
return n >= ;
}
};
void test08()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
int num = count_if(v.begin(), v.end(), greateFour());
cout << "大于等于4的个数为:" << num << endl;
} int main()
{
test01(); test02(); test03(); test04(); test05(); test06(); test07(); test08(); system("pause"); return ;
}

常用查找算法

#include <iostream>

#include<vector>

#include<algorithm>

#include<ctime>

using namespace std;

//sort(排序)
void myPrint01(int n)
{
cout << n << " ";
}
void test01()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
//默认从小到大
sort(v.begin(), v.end());
for_each(v.begin(), v.end(), myPrint01);
cout << endl;
//从大到小
sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), myPrint01);
cout << endl;
} //random_shuffle(洗牌)
class myPrint02
{
public:
void operator()(int n)
{
cout << n << " ";
}
};
void test02()
{
srand((unsigned int)time(NULL));
vector<int> v;
for (int i = ; i < ; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), myPrint02());
cout << endl;
//洗牌
random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), myPrint02());
cout << endl;
} //merge(合并)
void test03()
{
vector<int> v1;
vector<int> v2;
for (int i = ; i < ; i++)
{
v1.push_back(i);
v2.push_back(i + );
}
vector<int> vTarget;
vTarget.resize(v1.size() + v2.size());
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), vTarget.end(), myPrint02());
cout << endl;
} //reverse(反转)
void test04()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
cout << "反转前" << endl;
for_each(v.begin(), v.end(), myPrint02());
cout << endl;
cout << "反转后" << endl;
reverse(v.begin(), v.end());
for_each(v.begin(), v.end(), myPrint02());
cout << endl;
} int main()
{
test01(); test02(); test03(); test04(); system("pause"); return ;
}

常用排序算法

#include <iostream>

#include<vector>

#include<algorithm>

#include<ctime>

using namespace std;

class myPrint
{
public:
void operator()(int n)
{
cout << n << " ";
}
}; //copy
void test01()
{
vector<int> v1;
for (int i = ; i < ; i++)
{
v1.push_back(i + );
}
vector<int> v2;
v2.resize(v1.size());
//拷贝
copy(v1.begin(), v1.end(), v2.begin());
for_each(v2.begin(), v2.end(), myPrint());
cout << endl;
} //replace
void test02()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
cout << "替换前" << endl;
for_each(v.begin(), v.end(), myPrint());
cout << endl;
cout << "替换后" << endl;
//替换
replace(v.begin(), v.end(), , );
for_each(v.begin(), v.end(), myPrint());
cout << endl;
} //replace_if
class replaceGreate30
{
public:
bool operator()(int n)
{
return n >= ;
}
};
void test03()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
cout << "替换前" << endl;
for_each(v.begin(), v.end(), myPrint());
cout << endl;
cout << "替换后" << endl;
//按条件替换
replace_if(v.begin(), v.end(), replaceGreate30(), );
for_each(v.begin(), v.end(), myPrint());
cout << endl;
} //swap
void test04()
{
vector<int> v1;
vector<int> v2;
for (int i = ; i < ; i++)
{
v1.push_back(i);
v2.push_back(i + );
}
cout << "交换前" << endl;
for_each(v1.begin(), v1.end(), myPrint());
cout << endl;
for_each(v2.begin(), v2.end(), myPrint());
cout << endl;
cout << "交换后" << endl;
//交换
swap(v1, v2);
for_each(v1.begin(), v1.end(), myPrint());
cout << endl;
for_each(v2.begin(), v2.end(), myPrint());
cout << endl;
}
int main()
{
test01(); test02(); test03(); test04(); system("pause"); return ;
}

常用拷贝替换算法

#include <iostream>

#include<vector>

#include<algorithm>

#include<numeric>

using namespace std;

class myPrint
{
public:
void operator()(int n)
{
cout << n << " ";
}
}; //accumulate
void test01()
{
vector<int> v;
for (int i = ; i <= ; i++)
{
v.push_back(i);
}
//求和
int total = accumulate(v.begin(), v.end(), );
cout << "total = " << total << endl;
} //fill
void test02()
{
vector<int> v;
v.resize();
//填充
fill(v.begin(), v.end(), );
for_each(v.begin(), v.end(), myPrint());
cout << endl;
} int main()
{
test01(); test02(); system("pause"); return ;
}

常用算数生成算法

#include <iostream>

#include<vector>

#include<algorithm>

using namespace std;

//必须为有序序列集合
//交集(set_intersection)
//并集(set_union)
//差集(set_difference) class myPrint
{
public:
void operator()(int n)
{
cout << n << " ";
}
}; //set_intersection
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = ; i < ; i++)
{
v1.push_back(i);
v2.push_back(i + );
}
vector<int> vTarget;
vTarget.resize(min(v1.size(), v2.size()));
//交集
vector<int>::iterator it = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), it, myPrint());
cout << endl;
} //set_union
void test02()
{
vector<int> v1;
vector<int> v2;
for (int i = ; i < ; i++)
{
v1.push_back(i);
v2.push_back(i + );
}
vector<int> vTarget;
vTarget.resize(v1.size() + v2.size());
//并集
vector<int>::iterator it = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), it, myPrint());
cout << endl;
} //set_difference
void test03()
{
vector<int> v1;
vector<int> v2;
for (int i = ; i < ; i++)
{
v1.push_back(i);
v2.push_back(i + );
}
vector<int> vTarget;
vTarget.resize(max(v1.size(), v2.size()));
//差集
cout << "v1与v2的差集为:" << endl;
vector<int>::iterator it1 = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), it1, myPrint());
cout << endl;
cout << "v2与v1的差集为:" << endl;
vector<int>::iterator it2 = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
for_each(vTarget.begin(), it2, myPrint());
cout << endl;
} int main()
{
test01(); test02(); test03(); system("pause"); return ;
}

常用集合算法

end

传智播客C++视频学习笔记(5)的更多相关文章

  1. 传智播客C++视频学习笔记(3)

    #include<iostream> using namespace std; //内存分区模型 //代码区,存放二进制代码,由操作系统进行管理 //全局区,存放全局变量.静态变量.常量( ...

  2. 传智播客C++视频学习笔记(1)

    下载Visual Studio Community版本, #include<iostream> using namespace std; int main() { cout << ...

  3. 传智播客.NET视频学习课件

    传智播客.NET视频学习课件访问.NET网站了解更多课程详情http://net.itcast.cn(小提示:为什么本书中超链接打不开?)此套课件是伴随 传智播客.net实况教学视频 (小提示:为什么 ...

  4. 【传智播客】Libevent学习笔记(三):事件循环

    目录 00. 目录 01. event_base_loop函数 02. event_base_dispatch函数 03. event_base_loopexit函数 04. event_base_l ...

  5. 【传智播客】Libevent学习笔记(五):基本类型和函数

    目录 00. 目录 01. 基本类型 1.1 evutil_socket_t类型 1.2 标准类型 1.3 各种兼容性类型 02. 可移植的定时器函数 03. 套接字API兼容性 04. 可移植的字符 ...

  6. 【传智播客】Libevent学习笔记(四):事件event

    目录 00. 目录 01. 事件概述 02. 创建事件 03. 事件的标志 04. 事件持久性 05. 超时事件 06. 信号事件 07. 设置不使用堆分配的事件 08. 事件的未决和非未决 09. ...

  7. 【传智播客】Libevent学习笔记(二):创建event_base

    目录 00. 目录 01. 简介 02. 创建默认的event_base 03. 创建复杂的event_base 3.1 event_config_new函数 3.2 event_base_new_w ...

  8. 【传智播客】Libevent学习笔记(一):简介和安装

    目录 00. 目录 01. libevent简介 02. Libevent的好处 03. Libevent的安装和测试 04. Libevent成功案例 00. 目录 @ 01. libevent简介 ...

  9. 成都传智播客JDBC视频及讲师介绍

    成都传智播客java讲师,也许,你跟他很熟,你或者听过他的课,或者跟他争论过什么,又或者你们在一起共事,再者你们只是偶尔擦肩而过.在小编的印象中郭老师完全没有架子,和他相处会让你觉得不是面对一个老师, ...

随机推荐

  1. 7.JavaSE之类型转换

    类型转换: 由于Java是强类型语言,所以要进行运算的时候,需要用到类型转换. 图中优先级从低到高,小数优先级大于整数. 运算中,不同类型的数据需要转换为同一类型,然后进行运算. 强制类型转换:(类型 ...

  2. 代码审计之CVE-2017-6920 Drupal远程代码执行漏洞学习

     1.背景介绍: CVE-2017-6920是Drupal Core的YAML解析器处理不当所导致的一个远程代码执行漏洞,影响8.x的Drupal Core. Drupal介绍:Drupal 是一个由 ...

  3. [ Python入门教程 ] Python中JSON模块基本使用方法

    JSON (JavaScript Object Notation)是一种使用广泛的轻量数据格式,Python标准库中的json模块提供了一种简单的方法来编码和解码JSON格式的数据.用于完成字符串和p ...

  4. 超越队西柚考勤系统——beta冲刺3

    一.成员列表 姓名 学号 蔡玉蓝(组长) 201731024205 郑雪 201731024207 何玉姣 201731024209 王春兰 201731024211 二.SCRUM部分 (1)各成员 ...

  5. Dynamics 365 CRM 配置field service mobile

    配置field service mobile其实微软是有官方文档的, 但是没有坑的微软产品不是好产品. 一些细节设置文中还是没有考虑到的. 所以这里带大家配置一下field service mobil ...

  6. 优雅写Java之三(IO与文本解析)

    一.资源相关 二.路径与文件 读文件: String fileName = "str.txt"; Files.lines(Paths.get(fileName), Standard ...

  7. Linux系统实时数据同步inotify+rsync

    一.inotify简介 inotify是Linux内核的一个功能,它能监控文件系统的变化,比如删除.读.写和卸载等操作.它监控到这些事件的发生后会默认往标准输出打印事件信息.要使用inotify,Li ...

  8. 通过haar Cascades检测器来实现面部检测

    在OpenCV中已经封装的很好只需要使用cv::CascadeClassifier类就可以很容易的实现面部的检测, 三大步: 1.训练好的特征分类器配置文件haarcascade_frontalfac ...

  9. 工具之awk

    转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html awk是一个强大的文本分析工具,相对于grep的查找,sed的编 ...

  10. qt creator源码全方面分析(0)

    本人主攻C++和Qt. 上两天刚研究完Qt install framework(IFW)应用程序安装框架. google没发现有正儿八经的官方文档的翻译,我就进行了翻译哈!! 系列文章具体见:http ...