STL中的算法
来源:互联网 发布:中小型企业网络规划 编辑:程序博客网 时间:2024/06/06 02:52
1.仿函数:定义了一个对象,行为像函数,它就可以被当作函数来用。
2例如以下形式:
class X
{
public:
return-value operator() (arguments) const;
...
};
X fo;
fo(arg1,arg2);
3.仿函数的优点: 1)仿函数是智能型函数。
2)每个仿函数都有自己的类型。
3)仿函数通常比一般函数速度快。
4.STL中的算法大致分为四类:
1、非可变序列算法: 指不直接修改其所操作的容器内容的算法。
2、可变序列算法: 指可以修改它们所操作的容器内容的算法。
3、排序算法: 包括对序列进行排序和合并的算法、搜索算法以及有 序序列上的集合操作。
4、数值算法: 对容器内容进行数值计算。
5.非可变序列算法:是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。例如(find,find_if)
6.Find 函数原型:find( v1.begin(), v1.end(), num_to_find );返回一个迭代器。
7.Find_if函数利用返回布尔值的谓词判断pred,检查迭代器区间[first,last)(闭开区间)上的每一个元素,如果迭代器i满足pred(*i)=true,表示找到元素并返回迭代值i(找到的第一个符合条件的元素);未找到元素,返回末位置last,函数原型:find_if(v.begin(),v.end(), pred);
8.统计容器的某个区间内值为value的元素个数:count函数原型:count(v.begin(),v.end(), value);
9.统计容器的某个区间内能使pred为真的元素个数:count_if函数原型:count_if(v.begin(),v.end(), pred);
10.search:在一个序列中搜索与另一序列匹配的子序列。参数分别为一个序列的开始位置,结束位置和另一个序列的开始,结束位置。函数原型:search(v1.begin(),v1.end(),v2.begin(),v2.end());
11.search_n:搜索序列中是否有一系列元素值均为某个给定值的子序列。例如:在v中找到3个连续的元素8,search_n(v.begin(),v.end(),3,8);
12.find_end:搜索一个序列在另一个序列中的最后一个。函数原型:find_end(v1.begin(),v1.end(),v2.begin(),v2.end());
13.代码如下:
#include "Utility.h"
////--------------------仿函数-------------------------------
///*
//仿函数:类产生一个对象,调用自身重载过的()运算,仿佛像是
// 一个函数调用。
//实现方式:一个类重载()来实现。
//*/
//
//class Compare
//{
//public:
//bool operator()( int _value1, int _value2 )
//{
//return _value1 < _value2;
//}
//};
//
//template<typename T>
//void sort_Ints(int _iValue1, int _iValue2, T compare)
//{
////仿函数作用的体现:compare(_iValue1,_iValue2)仿佛是一个函数
//// 实际上是类对象调用自身重载过的()运算符。
//if ( compare(_iValue1,_iValue2) )
//cout << "2 is Big" << endl;
//else
//cout << "1 is Big" << endl;
//}
//
//void main()
//{
//int iValue1 = 20, iValue2 = 10;
//Compare compare;
//sort_Ints(iValue1, iValue2, compare);
//
//system("pause");
//}
//-----------STL中的算法---------------
template<typename T>
void printContainer(T _container)
{
for (T::iterator iter = _container.begin();
iter != _container.end();
++iter)
{
cout << (*iter) << " , ";
}
cout << endl;
}
//----------find_if()算法用到的仿函数---------
class GetOu
{
public:
bool operator()(int _iValue )
{
return (_iValue % 2 == 0);
}
};
void main()
{
int iArray[10] = { 3, 48, 957, 258, 85, 957, 43, 957, 4, 0 };
vector<int> iVector1(iArray, iArray + 10);
//-------find()算法-------
cout << "-------find()算法-------" << endl;
int iSearch = 957;
vector<int>::iterator findIter = find(iVector1.begin(), iVector1.end(), iSearch);
if (findIter != iVector1.end())
cout << "找到" << (*findIter) << endl;
else
cout << "没有找到" << iSearch << endl;
//---------find应用:查找某个容器中所有出现的值为value的数据,
//将这个数据的迭代器存储到一个list中--------
list< vector<int>::iterator > iterList1;
list<int> indexList;
vector<int>::iterator tempIter = iVector1.begin();
while (true)
{
tempIter = find(tempIter, iVector1.end(), iSearch);
if (tempIter != iVector1.end())
{
iterList1.push_back(tempIter);
indexList.push_back(tempIter - iVector1.begin());
++tempIter;
}
else
break;
}
cout << "找到" << iSearch << "元素的数量为:" << iterList1.size() << endl;
printContainer(indexList);
//-------find_if()算法-------
cout << "-------find_if()算法-------" << endl;
GetOu getOu;
vector<int>::iterator find_if_Iter = iVector1.begin();
while (true)
{
find_if_Iter = find_if(find_if_Iter, iVector1.end(), getOu);
if (find_if_Iter != iVector1.end())
{
cout << "找到" << (*find_if_Iter) << "位置为:" << find_if_Iter - iVector1.begin() << endl;
++find_if_Iter;
}
else
break;
}
//-------count()算法-------
cout << "-------count()算法-------" << endl;
cout << "值为" << iSearch << "的元素个数为:" <<
count(iVector1.begin(), iVector1.end(), iSearch) << endl;
//-------count_if()算法-------
cout << "-------count_if()算法-------" << endl;
cout << "偶数元素个数为:" << count_if(iVector1.begin(), iVector1.end(), getOu) << endl;
//-------search()算法-------
cout << "-------search()算法-------" << endl;
int iArray2[10] = { 348, 6535, 3, 3, 3, 72, 38, 5, 327, 634 };
vector<int> iVector2(iArray2, iArray2 + 10);
vector<int> iVector3(iArray2 + 5, iArray2 + 8);
cout << "iVector2 : ";
printContainer(iVector2);
cout << "iVector3 : ";
printContainer(iVector3);
vector<int>::iterator searchIter;
searchIter = search(iVector2.begin(), iVector2.end(), iVector3.begin(), iVector3.end());
if (searchIter != iVector2.end())
cout << "iVector2包含iVector3,起始位置为:" << searchIter - iVector2.begin() <<"结束位置为:"<< (searchIter-iVector2.begin())+(iVector3.size()) <<endl;
else
cout << "iVector2不包含iVector3" << endl;
//-------search_n()算法-------
cout << "-------search_n()算法-------" << endl;
vector<int>::iterator search_n_iter;
search_n_iter = search_n(iVector2.begin(), iVector2.end(), 3, 3);
if (search_n_iter != iVector2.end())
cout << "找到,起始位置为:" << search_n_iter - iVector2.begin() << endl;
else
cout << "没有找到!" << endl;
//-------find_end()算法-------
cout << "-------find_end()算法-------" << endl;
int iArray3[10] = { 20, 34, 1, 2, 716, 23, 47, 1, 2, 847 };
vector<int> iVector4(iArray3, iArray3 + 10);
vector<int> iVector5(iArray3 + 2, iArray3 + 4);
vector<int>::iterator find_end_iter;
find_end_iter = find_end(iVector4.begin(),
iVector4.end(),
iVector5.begin(),
iVector5.end());
if (find_end_iter != iVector4.end())
cout << "找到,位置为:" << find_end_iter - iVector4.begin() << endl;
else
cout << "没有找到!!!" << endl;
system("pause");
}
14.copy:元素复制函数原型:copy(v.begin(),v.end(),l.begin());
15.transform:元素变换,也是复制,但是要按某种方案复制。函数原型:transform(v.begin(),v.end(),l.begin(),square);
16.replace:替换 , 将指定元素值替换为新值例如:将v中的25替换为100函数原型:replace(v.begin(),v.end(),25,100);
17.replace_if:条件替换。函数原型:replace_if(v.begin(),v.end(),odd,100);将使odd成立的值变为100。
18.fill_n:n次填充从v.begin()这个位置添加5个-10(会覆盖原始数据) fill_n(v.begin(),5,-10);
19.generate:随机生成n个元素从v.begin开始的后面5个位置随机填写数据generate_n(v.begin(),5,rand);
20.使用rand函数必须要有随机数种子。Srand((usigned)time(0)),在程序中有且仅有一次就可以了。如果不添加随机数种子,每次随机出来的数字就会一样。
21.Rand()函数的用法:int N = rand() % 11;
这样,N的值就是一个0~10的随机数,如果要产生1~10,则是这样:
int N = 1 + rand() % 10;
总结来说,可以表示为:
a + rand() % n
其中的a是起始值,n是整数的范围。
a + rand() % (b-a+1) 就表示 a~b之间的一个随机数
22.remove_if:条件移除函数原型:remove_if(v.begin(),v.end(),even);
23.代码如下:
#include "Utility.h"
template<typename T>
void printContainer(T _container)
{
for (T::iterator iter = _container.begin();
iter != _container.end();
++iter)
{
cout << (*iter) << " , ";
}
cout << endl;
}
int square(int _value)
{
return _value*_value;
}
bool replaceIf( int _iValue )
{
return (_iValue % 2 == 0);
}
bool removeIf(int _iValue)
{
return (_iValue % 2 == 0);
}
void foreach( int & _iValue )
{
_iValue *= _iValue;
}
void main()
{
//---------copy()函数---------
//注意:目标存储区域应该足够容纳被copy的元素个数
cout << "---------copy()函数---------" << endl;
int iArray1[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
vector<int> iVector1(iArray1,iArray1+3);//1,3,5
list<int> iList1(iArray1 + 5, iArray1 + 10);//2,4,6,8,10
list<int>::iterator copyPos = iList1.begin();
++copyPos;
list<int>::iterator copyIter = copy(iVector1.begin(), iVector1.end(), copyPos);
printContainer(iVector1);
printContainer(iList1);
cout << "copy()后 copyIter指向" << (*copyIter) << endl;
//---------transform()函数---------
cout << "---------transform()函数---------" << endl;
int iArray2[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
vector<int> iVector2(iArray2, iArray2 + 3);//1,3,5
list<int> iList2(iArray2 + 5, iArray2 + 10);//2,4,6,8,10
list<int>::iterator transformIter = transform(iVector2.begin(), iVector2.end(), ++iList2.begin(), square);
printContainer(iVector2);
printContainer(iList2);
cout << "transform()后 transformIter指向" << (*transformIter) << endl;
//---------replace()函数---------
cout << "---------replace()函数---------" << endl;
vector<int> iVector3;
iVector3.push_back(10);
iVector3.push_back(15);
iVector3.push_back(10);
iVector3.push_back(15);
iVector3.push_back(10);
list<int> iList3;
iList3.push_back(20);
iList3.push_back(25);
iList3.push_back(20);
iList3.push_back(25);
iList3.push_back(20);
replace(iVector3.begin(), iVector3.end(), 15, 99);
printContainer(iVector3);
replace(iList3.begin(), iList3.end(), 25, 99);
printContainer(iList3);
//---------replace_if()函数---------
cout << "---------replace_if()函数---------" << endl;
int iArray4[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<int> iVector4(iArray4, iArray4 + 10);
replace_if(iVector4.begin(), iVector4.end(), replaceIf, -1);
printContainer(iVector4);
//---------fill_n()函数---------
//注意:不能超出原有的数据范围
cout << "---------fill_n()函数---------" << endl;
int iArray5[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<int> iVector5(iArray5, iArray5 + 5);
vector<int>::iterator fillIter = fill_n(iVector5.begin(), 3, 0);
printContainer(iVector5);
cout << "fill_n()后:" << (*fillIter) << endl;
//---------generate_n()函数---------
cout << "---------generate_n()函数---------" << endl;
vector<int> iVector6(10);
srand((unsigned)time(0)); //设定随机数种子(有且仅有1个就可以)
generate_n(iVector6.begin(), 10, rand);
printContainer(iVector6);
//---------remove_if()函数---------
cout << "---------remove_if()函数---------" << endl;
vector<int> iVector7;
for (int i = 1; i < 21; ++i)
iVector7.push_back(i);
vector<int>::iterator removeIter = remove_if(iVector7.begin(), iVector7.end(), removeIf);
iVector7.resize(removeIter - iVector7.begin());
printContainer(iVector7);
//---------unique()函数---------
cout << "---------unique()函数---------" << endl;
vector<int> iVector8;
iVector8.push_back(2);
iVector8.push_back(2);
iVector8.push_back(2);
iVector8.push_back(8);
iVector8.push_back(3);
iVector8.push_back(3);
iVector8.push_back(5);
vector<int>::iterator uniqueIter = unique(iVector8.begin(), iVector8.end());
iVector8.resize(uniqueIter - iVector8.begin());
printContainer(iVector8);
//---------for_each()函数---------
cout << "---------for_each()函数---------" << endl;
int iArray9[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<int> iVector9(iArray9, iArray9 + 10);
for_each(iVector9.begin(),iVector9.end(),foreach);
printContainer(iVector9);
system("pause");
}
- STL中的算法总结
- STL中的常用算法
- STl中的排序算法
- STL中的Sort 算法
- STL中的排序算法
- STL中的常用算法
- STL中的所有算法
- STL中的算法
- STL中的常用算法
- STL--C++中的算法
- stl中的rotate算法
- STl中的排序算法
- STl中的排序算法
- STL中的常用算法
- STL中的算法
- STL中的Sort算法
- STL中的常用算法
- STl中的排序算法
- python爬虫之BeautifulSoup入门
- java的封装
- 想学点东西
- CASIO fx-9750的贪吃蛇
- 安卓Activity生命周期相关
- STL中的算法
- 剑指offer:n个骰子的点数(java)
- iOS录音编程简介
- laravel ajax时间与关键字搜索、即点即改、批量删除
- linux之sed用法
- 面试心理测试题
- 剑指offer-算法题练习:part20 二叉树的镜像
- 第三章小结
- 【网络知识】——交换机上不了网问题