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");

}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机赌博输了钱怎么办 内存卡是扩容卡怎么办 坐了过山车想吐怎么办 坐完摇椅想吐怎么办 玩完过山车想吐怎么办 做了过山车想吐怎么办 坐车后恶心想吐怎么办 太胖了想减肥怎么办 被集资诈骗的人怎么办 教了作业没写怎么办 移动4g网速慢怎么办 小孩装病不去上学怎么办 卖衣服顾客嫌贵怎么办 当顾客说再看看怎么办 读完高中没考上大学怎么办 手抖不会写字了怎么办 字认识写不出来怎么办 八四把衣服发黄怎么办 孩孑在学校被打怎么办 在学校有人打我怎么办 孩子在学校不爱说话怎么办 孩子上幼儿园不和小朋友玩怎么办 遇到有人要打你怎么办 被表白了怎么办神回复 学校要发展我该怎么办 如果有人要打你怎么办 梦见有人要杀我怎么办 如果有人要杀我怎么办 梦到有人要杀我怎么办 感觉有人要杀我怎么办 我很自卑 没自信怎么办 如果在学校被打怎么办 如果有人打我该怎么办 别人要砍我我怎么办 专四两次没过怎么办 3岁宝宝害羞胆小怎么办 人太老实被欺负怎么办 在外面被欺负了怎么办 同学们老欺负我怎么办 孩子在学校受欺负怎么办 来例假吃了螃蟹怎么办