STL中的算法

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值