C++提高编程(2)

提高编程

    • 1.STL函数对象
      • 1.1函数对象
        • 1.1.1函数对象概念
          • 1.概念
          • 2.本质
        • 1.1.2函数对象使用
      • 1.2谓词
        • 1.2.1概念
      • 1.3内建函数对象
        • 1.3.1内建函数对象意义
          • 1.概念
          • 2.分类
          • 3.用法
        • 1.3.2算术仿函数
          • 1.功能描述
          • 2.仿函数原型
        • 1.3.3关系仿函数
          • 1.功能描述
          • 2.仿函数原型
        • 1.3.4逻辑仿函数
          • 1.功能描述
          • 2.函数原型
    • 2.STL常用算法
      • 2.1常用遍历算法
        • 2.1.1概述
        • 2.1.2 for_each
        • 2.1.3 transform
      • 2.2常用查找算法
        • 2.2.1概括
          • 1. 算法分类
        • 2.2.2 find
        • 2.2.3 find_if
          • 1.功能描述
          • 2.函数原型
        • 2.2.4 adjacent_find
          • 1.功能描述
        • 2.2.5binary_search
          • 1.功能描述
        • 2.2.6 count
          • 1.功能描述
          • 2.函数原型
        • 2.2.7 count_if
          • 1.功能描述
          • 2.函数原型
          • 3.统计次数使用int
      • 2.3常用排序算法
        • 2.3.1概述
          • 1.算法分类
        • 2.3.2 sort
        • 2.3.3 random_shuffle
          • 1.功能描述
        • 2.3.4 merge
          • 1.功能描述
          • 2.函数原型
        • 2.3.5 reverse
          • 1.功能描述
          • 2.函数原型
      • 2.4常用拷贝和替换算法
        • 2.4.1概述
        • 2.4.2 copy
          • 1.功能描述
          • 2.函数原型
      • 2.4.3 replace
        • 1.功能描述
        • 2.函数原型
        • 2.4.4replace_if
          • 1.功能描述
          • 2.函数原型
        • 2.4.5 swap
          • 1.功能概述
      • 2.5常用算术生成算法
        • 2.5.1概述
          • 1.注意
          • 2.算法分类
        • 2.5.2 accumulate
          • 1.功能描述
          • 2.函数原型
        • 2.5.3 fill
          • 1.功能描述
          • 2. 函数原型
      • 2.6常用集合算法
        • 2.6.1概述
          • 1.算法分类
        • 2.5.2 set_intersection
          • 1.功能描述
          • 2.函数原型
        • 2.5.3 set_union
          • 1.功能描述
          • 2. 函数原型
        • 2.5.4 set_difference
          • 1.功能描述
          • 2.函数原型

1.STL函数对象

1.1函数对象

1.1.1函数对象概念

1.概念
  • 重载函数调用操作符的类,其对象称为函数对象
  • 函数对象在使用重载的()时,行为类似函数调用,也叫仿函数
2.本质
  • 函数对象(仿函数)是一个类,不是一个函数

1.1.2函数对象使用

  • 特点
    • 函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
    • 函数对象超出普通函数的概念,函数对象可以有自己的状态
    • 函数对象可以作为参数传递
#include
using namespace std;
//仿函数(函数对象)


//1.函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
class Add
{
public:
	int operator()(int v1, int v2)
	{
		return v1 + v2;
	}
};

//2.函数对象超出普通函数的概念,函数对象可以有自己的状态
class MyPrint
{
public:
	MyPrint() {
		this->count = 0;
	}
	void operator()(string str)
	{
		cout << "需要打印的信息: " << str << endl;
		this->count++;
	}
	int count;//内部状态
};

//3.函数对象可以作为参数传递
void doPrint(MyPrint& mp, string str)
{
	mp(str);
}


void test()
{
	Add add;
	int num1 = add(10, 20);
	cout << "和为: " << num1 << endl;

	MyPrint myPrint;
	myPrint("C++");

	MyPrint mp;
	doPrint(mp, "C");
}

int main()
{


	test();
	system("pause");
	return 0;
}

1.2谓词

1.2.1概念

  • 概念
    • 返回bool类型的仿函数称为谓词
    • 如果operator()接受一个参数,那么叫做一元谓词
    #include
    using namespace std;
    #include
    #include
    class GreaterTen 
    {
    public:
    	bool operator()(int val)const
    	{
    		return val > 10;
    	}
    };
    
    
    void test()
    {
    	vector<int> vec;
    	vec.push_back(12);
    	vec.push_back(18);
    	vec.push_back(22);
    	vec.push_back(8);
    	vec.push_back(32);
    
    	// 字段_Pred,即为返回bool类型的仿函数
    	vector<int>::iterator it = find_if(vec.begin(), vec.end(), GreaterTen());
    	if (it == vec.end()) {
    		cout << "未找到" << endl;
    	}
    	else
    	{
    		cout << "找到了大于10的数字:" << *it << endl;
    	}
    }
    
    int main()
    {
    	test();
    	system("pause");
    	return 0;
    }
    
    • 如果operator()接受两个参数,那么叫做二元谓词

1.3内建函数对象

1.3.1内建函数对象意义

1.概念
  • STL内建了一些函数对象
2.分类
  • 算术仿函数
  • 关系仿函数
  • 逻辑仿函数
3.用法
  • 仿函数所产生的对象,用法和一般函数完全相同
  • 使用内建函数对象,需要引入头文件 #include

1.3.2算术仿函数

1.功能描述
  • 实现四则运算
  • 其中negate一元运算,其他都是二元运算
2.仿函数原型
  • 加法仿函数
template<class T> T plus<T>
  • 减法仿函数
template<class T> T minus<T>
  • 乘法仿函数
template<class T> T multiplies<T>
  • 除法仿函数
template<class T> T divides<T>
  • 取模仿函数
template<class T> modulus<T>
  • 取反仿函数
template<class T> negate<T>
#include
using namespace std;
#include

void test()
{
	negate<int> n;
	cout << n(50) << endl;// -50

	plus<int> p;
	cout << p(20, 20) << endl;// 40
}


int main()
{
	test();
	system("pause");
	return 0;
}

1.3.3关系仿函数

1.功能描述
  • 实现关系对比
2.仿函数原型
  • 等于
template<class T> bool equal_to<T>
  • 不等于
template<class T> bool not_equal_to<T>
  • 大于
template<class T> bool greater<T>
  • 大于等于
template<class T> bool greater_equal<T>
  • 小于
template<class T> bool less<T>
  • 小于等于
template<class T> bool less_equal<T>
#include
using namespace std;
#include
#include
#include

void printVector(const vector<int>& vec)
{
	for (vector<int>::const_iterator it = vec.begin();it != vec.end();it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

class MyCompare
{
public:
	bool operator()(int v1, int v2)const
	{
		return v1 > v2;
	}
};

void test()
{
	vector<int> vec;
	vec.push_back(12);
	vec.push_back(22);
	vec.push_back(8);
	vec.push_back(20);
	vec.push_back(15);

	cout << "vector数组初始化状态" << endl;
	printVector(vec);

	//排序 
	// 1.升序
	sort(vec.begin(), vec.end());
	cout << "vector数组升序排列" << endl;
	printVector(vec);

	// 2.降序
	// sort(vec.begin(), vec.end(), MyCompare());
	//    内建函数对象
	sort(vec.begin(), vec.end(), greater<int>());
	cout << "vector数组降序排列" << endl;
	printVector(vec);

}

int main()
{
	test();
	system("pause");
	return 0;
}

1.3.4逻辑仿函数

1.功能描述
  • 实现逻辑运算
2.函数原型
  • 逻辑与
template<class T> bool logical_and<T>
  • 逻辑或
template<class T> bool logical_and<T>
  • 逻辑非
template<class T> bool logical_and<T>

2.STL常用算法

  • 概述
    • 算法主要由头文件 组成

2.1常用遍历算法

2.1.1概述

  • 掌握常用的遍历算法
  • 分类
    • 遍历容器
    for_each
    
    • 搬运容器到另一个容器
    transform
    

2.1.2 for_each

  • 实现遍历容器
  • 函数原型
    • 遍历算法 遍历容器元素
    • beg开始迭代器
    • end结束迭代器
    • _func函数或函数对象
    for_each(iterator beg,iterator end,_func);
    
#include
using namespace std;
#include
#include


void printVector(const vector<int>& vec) 
{
	for (vector<int>::const_iterator it = vec.begin();it != vec.end();it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}


//普通函数
void compareVec(int vec) 
{
	cout << vec << " ";
}

//仿函数
class compareVect 
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}

};
void test()
{
	vector<int> vec;
	vec.push_back(10);
	vec.push_back(50);
	vec.push_back(8);
	vec.push_back(23);
	
	//普通遍历
	cout << "普通遍历" << endl;
	printVector(vec);

	//for_each遍历
	cout << "for_each遍历" << endl;
	//普通函数
	for_each(vec.begin(), vec.end(), compareVec);
	cout << endl;
	// 函数对象(仿函数)
	for_each(vec.begin(), vec.end(), compareVect());
	cout << endl;
	
}
int main()
{
	test();
	system("pause");
	return 0;
}

2.1.3 transform

  • 搬运容器到另一个容器(注: 目标容器需要开辟空间)
  • 函数原型
    • beg1源容器开始迭代器
    • end1源容器结束迭代器
    • beg2目标容器开始迭代器
    • _func函数或函数对象
    transform(iterator beg1,iterator end1,iterator beg2,_func)
    
#include
using namespace std;
#include
#include
#include


class printVec
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
class TransfVector
{
public:
	int operator()(int val) 
	{
		return val;
	}
};

void test()
{
	vector<int> vec;
	for (int i = 1;i <= 10;i++)
	{
		vec.push_back(i+(rand() % 100));
	}

	for_each(vec.begin(), vec.end(), printVec());
	cout << endl;

	//目标vector容器
	vector<int> vecT;
	//开辟容量
	vecT.resize(vec.size());
	transform(vec.begin(), vec.end(), vecT.begin(), TransfVector());
	for_each(vecT.begin(), vecT.end(), printVec());
	cout << endl;

}

int main()
{
	test();
	system("pause");
	return 0;
}

2.2常用查找算法

2.2.1概括

1. 算法分类
  • 查找元素
find
  • 按条件查找元素
find_if
  • 查找相邻重复元素
adjacent_find
  • 二分法查找法
binary_search
  • 统计元素个数
count
  • 按条件统计元素个数
count_if

2.2.2 find

  • 查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
  • 函数原型
    • 按值查找元素,找到返回指定位置的迭代器,找不到返回结束迭代器位置
    • beg 开始迭代器
    • end 结束迭代器
    • value 查找的元素
  • 注意自定义数据,需要重载操作符==
#include
using namespace std;
#include
#include
#include

class Person
{
public:
	Person(string name,int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
	//重载 == 底层find知道如何对比person数据类型
	bool operator==(const Person &person)
	{
		if (this->m_Name == person.m_Name && this->m_Age == person.m_Age)
		{
			return true;
		}
		else
		{
			return false;
		}
	}


	string m_Name;
	int m_Age;
};


void test()
{
	//内置数据类型
	vector<int> vec;
	for (int i = 1;i <= 10;i++)
	{
		vec.push_back(i + (rand() % 100));
	}

	//自定义数据类型
	vector<Person> vecp;
	Person p1("Tom", 22);
	Person p2("Jerry", 32);
	Person p3("Jack", 23);
	Person p4("Gost", 12);

	vecp.push_back(p1);
	vecp.push_back(p2);
	vecp.push_back(p3);
	vecp.push_back(p4);

	vector<int>::iterator itf = find(vec.begin(),vec.end(),23);
	if (itf == vec.end())
	{
		cout << "不存在该value值" << endl;
	}
	else
	{
		cout << "存在该值: " << *itf << endl;
	}

	vector<Person>::iterator itfp = find(vecp.begin(), vecp.end(), p2);
	if (itfp == vecp.end())
	{
		cout << "不存在此人" << endl;
	}
	else
	{
		cout << "存在此人" << ",姓名:"<<itfp->m_Name << ",年龄:" << itfp->m_Age << endl;

	}
}

int main() 
{
	test();
	system("pause");
	return 0;
}

2.2.3 find_if

1.功能描述
  • 按条件查找元素
2.函数原型
  • 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
  • beg 开始迭代器
  • end 结束迭代器
  • _Pred函数或函数对象(谓词,返回bool类型的仿函数)
#include
using namespace std;
#include
#include
#include

class Person
{
public:
	Person(string name,int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
	//重载 == 底层find知道如何对比person数据类型
	bool operator==(const Person &person)
	{
		if (this->m_Name == person.m_Name && this->m_Age == person.m_Age)
		{
			return true;
		}
		else
		{
			return false;
		}
	}


	string m_Name;
	int m_Age;
};


//内置数据类型
class GreaterTen
{
public:
	bool operator()(int val)
	{
		return val > 10;
	}
};
//自定义数据类型
class GetPersonAgeGt20
{
public:
	bool operator()(Person &person) 
	{
		return person.m_Age > 20;
	}
};
void test()
{
	//内置数据类型
	vector<int> vec;
	for (int i = 1;i <= 10;i++)
	{
		vec.push_back(i + (rand() % 100));
	}

	//自定义数据类型
	vector<Person> vecp;
	Person p1("Tom", 22);
	Person p2("Jerry", 32);
	Person p3("Jack", 23);
	Person p4("Gost", 12);

	vecp.push_back(p1);
	vecp.push_back(p2);
	vecp.push_back(p3);
	vecp.push_back(p4);

	vector<int>::iterator itf = find(vec.begin(),vec.end(),23);
	if (itf == vec.end())
	{
		cout << "不存在该value值" << endl;
	}
	else
	{
		cout << "存在该值: " << *itf << endl;
	}

	vector<Person>::iterator itfp = find(vecp.begin(), vecp.end(), p2);
	if (itfp == vecp.end())
	{
		cout << "不存在此人" << endl;
	}
	else
	{
		cout << "存在此人" << ",姓名:"<<itfp->m_Name << ",年龄:" << itfp->m_Age << endl;

	}

	//find_if条件查询,内置数据类型
	vector<int>::iterator itff = find_if(vec.begin(), vec.end(),GreaterTen() );
	if (itff == vec.end()) 
	{
		cout << "不存在大于10的数据" << endl;

	}
	else
	{
		cout << "存在大于10的数据,该数据为:" << *itff << endl;
	}
	//find_if条件查询,自定义数据类型
	vector<Person>::iterator itffp = find_if(vecp.begin(), vecp.end(), GetPersonAgeGt20());
	if (itffp == vecp.end())
	{
		cout << "不存在此人" << endl;
	}
	else
	{
		cout << "存在此人,姓名:" << itffp->m_Name << ",年龄:" << itffp->m_Age << endl;
	}


}

int main() 
{
	test();
	system("pause");
	return 0;
}

2.2.4 adjacent_find

1.功能描述
  • 查找相邻重复元素
  • 函数原型
    • 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
    • beg 开始迭代器
    • end 结束迭代器
    adjacent_find(iterator beg,iterator end)
    

2.2.5binary_search

1.功能描述
  • 查找指定元素是否存在
  • 函数原型
    • 查找指定元素,找到返回true,否则返回false
    • 注意,在无序序列中不可用
    • beg 开始迭代器
    • end 结束迭代器
    • value 查找的元素
vector<int> vec;
vec.push_back(12);
vec.push_back(13);
//非有序
//vec.push_back(2);

2.2.6 count

1.功能描述
  • 统计元素个数
2.函数原型
  • 统计元素出现次数
  • beg 开始迭代器
  • end 结束迭代器
  • value 统计的元素
// 统计  内置数据类型
	int num = count(vec.begin(), vec.end(), 45);
	cout << "数据为45的元素个数为:" << num << endl;

	//统计 自定义数据类型  需要重载operator==函数,指定年龄相同即可
	/*
		if(this->m_Age == person.m_Age)
		{
			return true;
		}
		else
		{
			return false;
		}
	*/
	Person person5("WTF", 23);
	int nump = count(vecp.begin(), vecp.end(), person5);
	cout << "和WTF年龄相同有多少:" << nump << endl;

2.2.7 count_if

1.功能描述
  • 按条件统计元素个数
2.函数原型
  • 按条件统计元素出现次数
  • beg 开始迭代器
  • end 结束迭代器
  • _Pred 谓词
count_if(iterator beg,iterator end,_Pred)
#include
using namespace std;
#include
#include
#include
#include

class Person
{
public:
	Person(string name,int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
	//重载 == 底层find知道如何对比person数据类型
	bool operator==(const Person &person)
	{
		if (this->m_Name == person.m_Name && this->m_Age == person.m_Age)
		{
			return true;
		}
		else
		{
			return false;
		}
	}


	string m_Name;
	int m_Age;
};




//内置数据类型
class Greater30
{
public:
	bool operator() (int val)
	{
		return val > 30;
	}
};

//自定义数据类型
class GetAgeGreater20
{
public:
	bool operator()(const Person &person)
	{
		return person.m_Age > 20;
	}
};
void test()
{
	//内置数据类型
	vector<int> vec;
	for (int i = 1;i <= 10;i++)
	{
		vec.push_back(i + (rand() % 100));
	}

	//自定义数据类型
	vector<Person> vecp;
	Person p1("Tom", 22);
	Person p2("Jerry", 32);
	Person p3("Jack", 23);
	Person p4("Gost", 12);

	vecp.push_back(p1);
	vecp.push_back(p2);
	vecp.push_back(p3);
	vecp.push_back(p4);

	//count_if 内置数据统计
	int numf = count_if(vec.begin(), vec.end(), Greater30());
	cout << "大于30的元素出现多少次:" << numf << endl;

	// count_if  自定义数据统计
	int numfp = count_if(vecp.begin(), vecp.end(), GetAgeGreater20());
	cout << "获取年龄大于20的人数:" << numfp << endl;
}

int main() 
{
	test();
	system("pause");
	return 0;
}
3.统计次数使用int
  • 问题
    编译器错误: 从’_int64’转换为’int’,可能导致数据丢失
  • 解决方式
    • (1)auto作为推导类型是c++ 11特性。linux出现错误,可能是Linux编译器没有它作为默认值(只需要使用 -std=c++11)
    • (2)std::count的返回类型是size_t,不是int,并且size_t转换为int可能丢失数据

2.3常用排序算法

2.3.1概述

1.算法分类
  • 对容器内元素进行排序
sort
  • 洗牌 指定范围内的元素随机调整次序
random_shuffle
  • 容器元素合并,并存储到另一个容器
merge
  • 反转指定范围的元素
reverse

2.3.2 sort

  • 容器内元素进行排序
  • 函数原型
    • 按值查询元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    • beg 开始迭代器
    • end 结束迭代器
    • _Perd 谓词
    sort(iterator beg,iterator end,_Pred)
    
#include
using namespace std;
#include
#include
#include
#include

void printVect(int val)
{
	cout << val << " ";
}

class PrintVec 
{
public:
	bool operator()(int v1,int v2) 
	{
		return v1 > v2;
	}
};
void test()
{
	vector<int> vec;
	for (int i = 1;i <= 10;i++)
	{
		vec.push_back(i + (rand() % 100));
	}
	//利用sort进行升序排列
	sort(vec.begin(), vec.end());
	for_each(vec.begin(), vec.end(), printVect);
	cout << endl;

	//利用sort进行降序排列
	// 利用内建函数
	//sort(vec.begin(), vec.end(), greater());
	sort(vec.begin(), vec.end(), PrintVec());// 效果同上
	for_each(vec.begin(), vec.end(), printVect);
	cout << endl;
}


int main()
{
	test();
	system("pause");
	return 0;
}

2.3.3 random_shuffle

1.功能描述
  • 指定范围内的元素随机调整次序
  • 函数原型
    • 指定范围内的元素随机调整次序
    • beg 开始迭代器
    • end 结束迭代器
    random_shuffle(iterator beg,iterator end)
    
//random_shuffle  进行随机调整元素
	random_shuffle(vec.begin(), vec.end());
	for_each(vec.begin(), vec.end(), printVect);
	cout << endl;
}

2.3.4 merge

1.功能描述
  • 两个容器元素合并,并存储到另一个容器
2.函数原型
  • 容器元素合并,并存储到另一个容器
  • 注意: 两个容器必须是有序的
  • beg1 容器1开始迭代器
  • end1 容器1结束迭代器
  • beg2 容器2开始迭代器
  • end2 容器2结束迭代器
  • dest 目标容器开始迭代器
    merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
    
  • 注意点: 目标容器需要提前开辟容量

2.3.5 reverse

1.功能描述
  • 将容器内元素进行反转
2.函数原型
  • 反转指定范围的元素
  • beg 开始迭代器
  • end 结束迭代器
reverse(iterator beg,iterator end)
//reverse  进行元素反转
reverse(vec.begin(), vec.end());
for_each(vec.begin(), vec.end(), printVect);
scout << endl;

2.4常用拷贝和替换算法

2.4.1概述

  • 算法分类
    • 容器内指定范围元素拷贝到另一个容器
    copy
    
    • 将容器内指定范围的旧元素修改为新元素
    replace
    
    • 容器内指定范围满足条件的元素替换为新元素
    replace_if
    
    • 互换两个容器的元素
    swap
    

2.4.2 copy

1.功能描述
  • 容器内指定范围的元素拷贝到另一个容器
2.函数原型
  • 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
  • beg 开始迭代器
  • end 结束迭代器
  • dest 目标起始迭代器
copy(iterator beg,iterator end,iterator dest)
// copy   将容器指定范围拷贝到目标容器
vector<int> vecc;
vecc.resize(vec.size());
copy(vec.begin(), vec.end(), vecc.begin());
for_each(vecc.begin(), vecc.end(), printVect);
cout << endl;

2.4.3 replace

1.功能描述

  • 容器内指定范围的旧元素修改为新元素

2.函数原型

  • 将区间内旧元素替换成 新元素
  • beg 开始迭代器
  • end 结束迭代器
  • oldvalue 旧元素
  • newvalue 新元素
replace(iterator beg,iterator end,oldvalue,new value)
//如果容器没有该元素,不做任何处理
replace(vecc.begin(), vecc.end(), 85, 99);
for_each(vecc.begin(), vecc.end(), printVect);
cout << endl;

2.4.4replace_if

1.功能描述
  • 将区间内满足条件的元素,替换成指定元素
2.函数原型
  • 按条件替换元素,满足条件的替换成指定元素
  • beg 开始迭代器
  • end 结束迭代器
  • _Pred 谓词
  • newValue 替换的新元素
replace_if(iterator beg,iterator end,_Pred,newValue)
class ReplaceElement
{
public:
	bool operator()(int val)
	{
		return val > 50;
	}
};



//replace_if  按条件替换元素
replace_if(vecc.begin(),vecc.end(),ReplaceElement(), 66);
for_each(vecc.begin(), vecc.end(), printVect);
cout << endl;

2.4.5 swap

1.功能概述
  • 互换两个容器的元素
  • 函数原型
    • 互换两个容器的元素
    • c1容器1
    • c2容器2
    swap(container c1,container c2)
    
	// swap  容器互换
	vector<int> vecs;
	for (int i = 1;i <= 10;i++)
	{
		vecs.push_back(i + 10);
	}
	swap(vec, vecs);
	for_each(vec.begin(), vec.end(), printVect);
	cout << endl;
	for_each(vecs.begin(), vecs.end(), printVect);
	cout << endl;

2.5常用算术生成算法

2.5.1概述

1.注意
  • 算术生成算法属于小型算法,使用时包含的头文件为 #include
2.算法分类
  • 计算容器元素累计和
accumulate
  • 向容器中添加元素
fill

2.5.2 accumulate

1.功能描述
  • 计算区间内 容器元素累计总和
2.函数原型
  • 计算容器元素累计总和
  • beg 开始迭代器
  • end 结束迭代器
  • value 起始值
accumulate(iterator beg,iterator end,value)
// value  为起始累加值
int total = accumulate(vec.begin(),vec.end(),0);
cout <<"总和:" << total << endl;

2.5.3 fill

1.功能描述
  • 向容器中填充指定元素
2. 函数原型
  • 向容器中填充元素
  • beg 开始迭代器
  • end 结束迭代器
  • value 填充的值
fill(iterator beg,iterator end,value)

2.6常用集合算法

2.6.1概述

1.算法分类
  • 求两个容器的交集
set_intersection
  • 求两个容器的并集
set_union
  • 求两个容器的差集
set_difference

2.5.2 set_intersection

1.功能描述
  • 求两个容器的交集
2.函数原型
  • 求两个集合的交集
  • 注意: 两个集合必须是有序序列
  • beg1 容器1开始迭代器
  • end1 容器1结束迭代器
  • beg2 容器2开始迭代器
  • end2 容器2结束迭代器
  • dest 目标容器开始迭代器
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
	//set_intersection
	vector<int> vecd;
	vecd.resize(min(vec.size(),vecs.size()));
	sort(vec.begin(), vec.end());
	sort(vecs.begin(), vecs.end());
	for_each(vecs.begin(), vecs.end(), printVect);
	cout << endl;
	//返回集合的结束迭代器
	vector<int>::iterator desVec = set_intersection(vec.begin(),vec.end(),vecs.begin(),vecs.end(),vecd.begin());
	for_each(vecd.begin(), desVec, printVect);
	cout << endl;

2.5.3 set_union

1.功能描述
  • 求两个集合的并集
2. 函数原型
  • 求两个容器的并集
  • 注意: 两个集合必须是有序序列
  • beg1 容器1开始迭代器
  • end1 容器1结束迭代器
  • beg2 容器2开始迭代器
  • end2 容器2结束迭代器
  • dest 目标容器开始迭代器
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
	//set_union
	vector<int> vecu;
	vecu.resize(vecs.size()+vec.size());
	vector<int>::iterator vecuEnd = set_union(vec.begin(), vec.end(), vecs.begin(), vecs.end(), vecu.begin());
	for_each(vecu.begin(), vecuEnd, printVect);
	cout << endl;

2.5.4 set_difference

1.功能描述
  • 求两个集合的差集
  • v1和v2容器,以v1容器为主体,和v2容器对比,元素不重合且v1有的元素,反之
2.函数原型
  • 求两个容器的差集
  • 注意: 两个集合必须是有序序列
  • beg1 容器1开始迭代器
  • end1 容器1结束迭代器
  • beg2 容器2开始迭代器
  • end2 容器2结束迭代器
  • dest 目标容器开始迭代器
set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
// set_difference
vector<int> veci;
veci.resize(max(vec.size(),vecs.size()));
vector<int>::iterator veciEnd = set_difference(vec.begin(), vec.end(), vecs.begin(), vecs.end(), veci.begin());
for_each(veci.begin(), veciEnd, printVect);
cout << endl;

你可能感兴趣的:(C++,C++基础入门,C++核心编程,c++,算法,开发语言)