算法主要是有头文件 组成
是所有STL头文件中最大的一个,其中常用的功能涉及比较,交换,查找遍历,复制,修改,反转,排序,合并等。
体积很小,只包括在几个序列容器上进行简单运算的额模板函数。
定义了一些模板类,用以声明函数对象。
1常用遍历算法:
遍历算法 遍历容器元素
@param beg 开始迭代器
@param end 结束迭代器
@param _callback 函数回调或者函数对象
@return 函数对象
for_each(iterator beg,iterator end,_callback)
transform算法 将指定容器区间元素搬运到另一个容器中
注意:transform不会给目标容器分配内存,所以需要我们提前分配好内存
@param bge1 源容器开始迭代器
@param end1 源容器结束迭代器
@param beg2 目标容器开始迭代器
@param _callback 回调函数或者函数对象
@return 返回目标容器迭代器
transform(iterator beg1,iterator end1,iterator beg2,_callback);
//An highlighted block
void Print(int val)
{
cout << val << endl;
}
class Print1
{
public:
void operator () (int val)
{
cout << val << endl;
}
};
void test1()
{
vector<int> v;
for (int i = 0;i<10;i++)
{
v.push_back(i);
}
for_each(v.begin(),v.end(),Print);
cout << "--------------------------" << endl;
for_each(v.begin(),v.end(),Print1());
}
//An highlighted block
//for_each可以保存内存记录
//for_each有返回值
struct Print2
{
void operator()(int val)
{
cout << val << endl;
num++;
}
int num;
};
void test2()
{
vector<int>v;
for (int i = 0;i<10;i++)
{
v.push_back(i);
}
Print2 p = for_each(v.begin(),v.end(),Print2());
cout <<"num=" << p.num << endl;
}
//An highlighted block
//for_each可以绑定参数进行输出
struct Print3 :public binary_function<int,int,void>
{
void operator() (int val1 ,int val2) const
{
cout << "第一个参数是:" << val1 << "第二个参数是:" << val2 << "和为:" << val1 + val2 << endl;
}
};
void test3()
{
vector<int>v;
for (int i = 0;i < 10;i++)
{
v.push_back(i);
}
for_each(v.begin(),v.end(),bind2nd( Print3(),100 ));
}
//An highlighted block
class Transform
{
public:
int operator ()(int val)
{
return val;
}
};
void test4()
{
vector<int>v;
for (int i = 0;i < 10;i++)
{
v.push_back(i);
}
vector<int> v2; //目标容器
v2.resize(v.size()); //分配内存
transform(v.begin(),v.end(),v2.begin(),Transform());
for_each(v2.begin(),v2.end(),[](int val){cout << val << " ";});
}
//An highlighted block
//transform第二种用法 将两个容器数据相加搬运到目标容器
class Transform2
{
public:
int operator ()(int val1,int val2)
{
return val1 + val2;
}
};
void test5()
{
vector<int>v1;
vector<int>v2;
for (int i = 0;i < 10;i++)
{
v1.push_back(i);
v2.push_back(i+10);
}
vector<int>v3;
v3.resize(v1.size());
transform(v1.begin(),v1.end(),v2.begin(),v3.begin(),Transform2());
for_each(v3.begin(),v3.end(),[](int val){cout << val << " ";});
}
2常用查找算法
find 算法 查找元素
@param beg容器开始迭代器
@param end容器结束迭代器
@param value 查找的元素
@return 返回查找元素的位置
find(iterator beg,iterator end,value)
find_if算法 条件查找
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 回调函数或者谓词(返回bool类型的函数对象)
@return bool 查找返回true 否则返回false
find_if(iterator beg,iterator end,_callback)
adjacent_find算法 查找相邻重复元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 回调函数或者谓词(返回bool类型的函数对象)
@return 返回相邻元素的第一个位置的迭代器
adjacent_find(iterator beg,iterator end,_callback)
//An highlighted block
void test1()
{
vector<int> v;
for (int i = 0;i <10; i++)
{
v.push_back(i);
}
vector<int>::iterator pos = find(v.begin(),v.end(),5);
if (pos != v.end())
{
cout << "找到了数据:" << *pos << endl;
cout << "在第" << pos - v.begin() +1 << "个位置" << endl;
}
else
{
cout << "没有找到" << endl;
}
}
//An highlighted block
//利用find查找自定义的数据类型
class Person
{
public:
Person(string name,int age)
{
this->_Name= name;
this->_Age = age;
}
bool operator == (const Person &p)
{
if (this ->_Name == p._Name && this->_Age == p._Age)
{
return true;
}
return false;
}
string _Name;\
int _Age;
};
void test2()
{
vector<Person> v;
Person p1("ac",11);
Person p2("edf",1);
Person p3("ghi",8);
Person p4("lk",22);
Person p5("sis",19);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
vector<Person>::iterator it = find(v.begin(),v.end(),p2);
if (it != v.end())
{
cout << "找到了,姓名是:" << (*it)._Name << " 年龄是:" << it ->_Age << endl;
}
else
{
cout << "没有找到" << endl;
}
}
//An highlighted block
class myCompare : public binary_function<Person*,Person*,bool>
{
public:
bool operator ()(Person *p1,Person * p2) const
{
if (p1->_Name == p2 ->_Name && p1->_Age == p2->_Age )
{
return true;
}
return false;
}
};
void test3()
{
vector<Person*> v;
Person p1("ac",11);
Person p2("edf",1);
Person p3("ghi",8);
Person p4("lk",22);
Person p5("sis",19);
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
Person *p = new Person("ac",11);
vector<Person*>::iterator pos = find_if(v.begin(),v.end(),bind2nd(myCompare(),p));
if (pos != v.end())
{
cout << "找到了,姓名是:" << (*pos)->_Name << " 年龄是:" << (*(*pos))._Age<< endl;
}
else
{
cout << "没有找到" << endl;
}
}
//An highlighted block
void test4()
{
vector<int> v;
v.push_back(10);
v.push_back(10);
v.push_back(10);
v.push_back(30);
v.push_back(40);
v.push_back(30);
v.push_back(30);
vector<int>::iterator it = adjacent_find(v.begin(),v.end());
//vector::iterator it = adjacent_find(v.begin(),v.end(),[](int val1,int val2){return val1 == val2;});
if (it != v.end())
{
cout << "找到了" << *it << endl;
}
else
{
cout << "没有找到" << endl;
}
}
binary_search算法 二分查找法
注意:在无序序列中不可用
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 查找的元素
@return bool 查找返回true 否则返回false
bool binary_search(iterator beg,iterator end,value)
count算法 统计元素出现次数
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 回调函数或者谓词(返回bool类型的函数对象)
@return int 返回元素个数
count_if(iterator beg,iterator end,_callback)
//An highlighted block
void test5()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
bool a = binary_search(v.begin(),v.end(),4);
if(a)
{
cout << "找到了4" << endl;
}
else
{
cout << "没有找到" << endl;
}
}
void test6()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
v.push_back(4);
v.push_back(4);
int num = count(v.begin(),v.end(),4);
cout << "4一共有" << num << "个" << endl;
int num2 = count_if(v.begin(),v.end(),[](int val1){return val1 < 4;});
cout << "小于4一共有:" << num2 <<"个" << endl;
}
3常用排序算法
merge算法 容器元素合并 并存储到另一容器中 这两个容器必须是有序的
@param beg1 容器1开始迭代器
@param end1 容器1结束迭代器
@param beg2 容器2开始迭代器
@param end2 容器2结束迭代器
@param dest 目标容器开始迭代器 需要提前分配好目标容器的内存
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
sort算法 容器元素排序
注意:两个容器必须是有的
@param beg 容器1开始迭代器
@param end 容器1结束迭代器
@param _callback 回调函数或者谓词(返回bool类型的函数对象)
sort(iterator beg,iterator end,_callback)
random_shuffle算法 对指定范围内的元素随机排序 和rand一样 配合srand使用
@param beg 容器开始迭代器
@param end 容器结束迭代器
random_shuffle(iterator beg,iterator end)
reverse 算法 反转指定范围的元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
reverse(iterator beg,iterator end)
//An highlighted block
void test1()
{
vector<int> v1;
vector<int> v2;
vector<int> v3;
for (int i = 0; i<10;i++)
{
v1.push_back(i+10);
v2.push_back(i+11);
}
v3.resize(v1.size() + v2.size());
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
for_each(v3.begin(),v3.end(),[](int val){cout << val << " ";});
}
//An highlighted block
void test2()
{
vector<int> v;
v.push_back(10);
v.push_back(70);
v.push_back(40);
v.push_back(90);
v.push_back(20);
v.push_back(40);
v.push_back(30);
sort(v.begin(),v.end());
for_each(v.begin(),v.end(),[](int val){cout << val << " ";});
cout << endl;
cout << "-------------------------------" << endl;
sort(v.begin(),v.end(),greater<int>());
for_each(v.begin(),v.end(),[](int val){cout << val << " ";});
cout << endl;
}
//An highlighted block
/*
random_shuffle(iterator beg,iterator end) 洗牌 配合srand使用
*/
void test3()
{
vector<int> v;
for (int i = 0;i<10;i++)
{
v.push_back(i);
}
random_shuffle(v.begin(),v.end());
for_each(v.begin(),v.end(),[](int val){cout << val << " ";});
}
//An highlighted block
/*
reverse 算法 反转指定范围的元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
reverse(iterator beg,iterator end)
*/
void test4()
{
vector<int> v;
for (int i = 0;i<10;i++)
{
v.push_back(i);
}
reverse(v.begin(),v.end());
for_each(v.begin(),v.end(),[](int val){cout << val << " ";});
}
copy算法 将容器内指定范围的元素拷贝到另一容器中
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param dest 目标其实迭代器
copy(iterator beg,iterator end,iterator dest)
replace算法 将容器内指定范围的旧元素改为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param oldvalue 旧元素
@param newvalue 新元素
replace(iterator beg,iterator end,oldvalue,new value)
replace_if 算法 将容器内指定范围满足条件的元素替换为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 函数回调或者谓词(返回bool类型的函数对象)
@param newvalue 新元素
replace_if(iterator beg,iterator end,_callback,newvalue)
swap 算法 互换两个容器的元素
@param c1 容器1
@param c2 容器2
swap(container c1,container c2)
//An highlighted block
/*
copy算法 将容器内指定范围的元素拷贝到另一容器中
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param dest 目标其实迭代器
copy(iterator beg,iterator end,iterator dest)
*/
void test1()
{
vector<int> v;
for (int i = 0;i<10;i++)
{
v.push_back(i);
}
vector<int> v1;
v1.resize(v.size());
copy(v.begin(),v.end(),v1.begin());
for_each(v1.begin(),v1.end(),[](int val){cout << val << " ";});
cout << endl;
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout ," "));
cout << endl;
}
//An highlighted block
/*
replace算法 将容器内指定范围的旧元素改为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param oldvalue 旧元素
@param newvalue 新元素
replace(iterator beg,iterator end,oldvalue,new value)
replace_if 算法 将容器内指定范围满足条件的元素替换为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param _callback 函数回调或者谓词(返回bool类型的函数对象)
@param newvalue 新元素
replace_if(iterator beg,iterator end,_callback,newvalue)
*/
class Mycompare
{
public:
bool operator ()(int val)
{
return val > 3;
}
};
void test2()
{
vector<int> v;
for (int i = 0;i<10;i++)
{
v.push_back(i);
}
//需求 把容器中的3替换为300
replace(v.begin(),v.end(),3,300);
for_each(v.begin(),v.end(),[](int val){cout << val << " ";});
cout << endl;
//需求 把容器中所有大于3的数字 都换成3000
replace_if(v.begin(),v.end(),Mycompare(),3000);
copy(v.begin(),v.end(),ostream_iterator<int>(cout ," "));
cout << endl;
}
//An highlighted block
void test3()
{
vector<int> v1;
for (int i =0;i<10;i++)
{
v1.push_back(i);
}
vector<int> v2;
v2.push_back(100);
v2.push_back(200);
v2.push_back(300);
v2.push_back(400);
v2.push_back(500);
cout << "交换前" << endl;
cout << "v1:" ;
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
cout << endl << "v2:" ;
for_each(v2.begin(),v2.end(),[](int val){cout << val << " ";});
cout << endl;
swap(v1,v2);
cout << "交换后" << endl;
cout << "v1:" ;
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
cout << endl << "v2:" ;
for_each(v2.begin(),v2.end(),[](int val){cout << val << " ";});
cout << endl;
}
5常用算数生成算法
accumulate 算法 计算容器元素累计总和 头文件#include
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 起始累加值
accumulate(iterator beg,iterator end,value)
fill算法 向容器中添加元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 填充元素
fill(iterator beg,iterator end,value)
//An highlighted block
void test1()
{
vector<int> v;
for (int i = 0; i<= 100;i++)
{
v.push_back(i);
}
//0到100的累加和
//第三个参数 起始累加值
int num = accumulate(v.begin(),v.end(),0);
cout << "总和为:" << num << endl;
}
//An highlighted block
void test2()
{
vector<int>v;
v.resize(10);
fill(v.begin(),v.end(),1);
copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
}
6常用集合算法
set_intersection 算法 求两个set集合的交集(相同的部分)
注意:两个集合必须是有序序列
@param beg1 容器1的开始迭代器
@param end1 容器1的结束迭代器
@param beg2 容器2的开始迭代器
@param end2 容器2的结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
set_union 算法 求两个set集合的并集(合起来去掉重复的元素)
注意:两个集合必须是有序序列
@param beg1 容器1的开始迭代器
@param end1 容器1的结束迭代器
@param beg2 容器2的开始迭代器
@param end2 容器2的结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
set_difference 算法 求两个set集合的差集
注意:两个集合必须是有序序列
@param beg1 容器1的开始迭代器
@param end1 容器1的结束迭代器
@param beg2 容器2的开始迭代器
@param end2 容器2的结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
//An highlighted block
void test1()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i<10;i++)
{
v1.push_back(i);
v2.push_back(i + 5);
}
cout << "v1的元素:";
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
cout << endl << "v2的元素:" ;
copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
cout << endl;
vector<int> d;
d.resize( min(v1.size() , v2.size()) );
vector<int>::iterator itEnd = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),d.begin());
cout << "v1和v2的交集为:" ;
copy(d.begin(),itEnd,ostream_iterator<int>(cout," "));
cout << endl;
}
//An highlighted
void test2()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i<10;i++)
{
v1.push_back(i);
v2.push_back(i + 5);
}
cout << "v1的元素:";
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
cout << endl << "v2的元素:" ;
copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
cout << endl;
vector<int> d;
d.resize(v1.size() + v2.size() );
vector<int>::iterator itEnd = set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),d.begin());
cout << "v1和v2的并集为:" ;
copy(d.begin(),itEnd,ostream_iterator<int>(cout," "));
cout << endl;
}
//An highlighted block
void test3()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i<10;i++)
{
v1.push_back(i);
v2.push_back(i + 5);
}
cout << "v1的元素:";
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
cout << endl << "v2的元素:" ;
copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
cout << endl;
vector<int> d;
d.resize(max(v1.size(),v2.size()) );
//v1在前就是v1差v2
vector<int>::iterator itEnd = set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),d.begin());
cout << "v1差v2的差集为:" ;
copy(d.begin(),itEnd,ostream_iterator<int>(cout," "));
cout << endl;
itEnd = set_difference(v2.begin(),v2.end(),v1.begin(),v1.end(),d.begin());
cout << "v2差v1的差集为:" ;
copy(d.begin(),itEnd,ostream_iterator<int>(cout," "));
cout << endl;
}