STL算法学习

来源:互联网 发布:大数据精准营销案例 编辑:程序博客网 时间:2024/05/16 18:49

一、accumulate:

1.功能:该算法是对容器中指定范围的元素进行相加。

2.举例:

vector<string> VeTemp;VeTemp.push_back("hello");VeTemp.push_back("world");string temp = "huang";string sum = ::accumulate(VeTemp.begin(),VeTemp.end(),temp);

3.头文件:#include <numeric>


二、find_first_of

1.功能:找到容器1中第一个与容器2相等的元素,返回找到后的迭代器

2.举例:

vector<string> VeTemp;VeTemp.push_back("hello");VeTemp.push_back("world");list<string> ListTemp;ListTemp.push_back("huang");ListTemp.push_back("hello");vector<string>::iterator ItVeTemp = VeTemp.begin();if( (ItVeTemp = find_first_of(ItVeTemp,VeTemp.end(),ListTemp.begin(),ListTemp.end() )) != VeTemp.end() ){cout<<(*ItVeTemp)<<endl;}
3.头文件:#include <algrithm>

三、fill

1.功能:对给定范围的容器填充某个元素

2.举例:

vector<int> ve(2);ve.fill(ve.begin(),ve.end(),0);

3.头文件:#include <algrithm>


四、fill_n

1.功能:对给定容器初始范围的容器填充n个指定的元素

2.举例:

vector<int> ve(10);ve.fill_n(ve.begin(),10,0);   //对ve容器填充10个0
3.头文件:#include <algrithm>
注意:以上两个算法必须在容器有容量存储相应元素的前提下可以进行。

例如以下是“及其危险”的:

vector<int> veve.fill_n(ve.begin,10,0);  //ve的capacity为0,不能进行填充
但是添加一个插入迭代器(insert iterator)是可以的。

例如:

vector<int> ve;fill_n(back_insert(ve),10,0);  //这是可以的

back_insert 的头文件为#include <iterator>


五、replace  与 replace_copy

1.功能:replace将给定范围的容器进行元素替换,replace_copy则将替换后的结果保存到一个新的容器,原容器不改变

2.举例:

replace:

vector<int> ve(10,0);replace(ve.begin(),ve.end(),0,10);  //将ve中所有为0的元素替换为10


replace_copy:

vector<int> vet;replace_copy(ve.begin,ve.end(),back_insert(vet),0,10);   //将ve中所有为0的元素替换为10,并保存在vet中

六、sort

1.功能:对容器中按“<"号进行排序

2.举例:

vector<string> ve;ve.push_back("b");ve.push_back("a");sort(ve.begin,ve.end());  //则将ve中的元素排序为a,b


七、stable_sort

1.功能:和sort一样,在碰到按要求方式相等的时候,保持原来元素的数序不变

2.举例:

sort(words.begin(),words.end() );    //alphabetically(按字母排序后)bool isShorter(const string &str1,const string &s2){return s1.size() < s2.size();}sort(words.begin(),words.end(),isShorter);  //按大小排序,并且出现大小相等的情况下的时候,不会改变原来按字母排序后的顺序。

七、unique

1.功能:将相邻相等的元素移动到后面,返回的迭代器指向第一个被移动到后面的元素

2.举例:

vector<string> VeTemp;VeTemp.push_back("a");VeTemp.push_back("d");VeTemp.push_back("b");VeTemp.push_back("d");VeTemp.push_back("a");        sort(VeTemp.begin(),VeTemp.end());        vector<string>::iterator it = unique(VeTemp.begin(),VeTemp.end());这样并没有把重复的元素给删除,如果要真正的删除,则需要调用容器的函数。ve.erase(it,VeTemp.end());


八、make_plural

1.功能:根据第一个参数返回一个string类型

2.举例:

string make_plural(size_t ctr,const string &word, const string &ending){  return (ctr==1) ? word : word+ending;//make_plural(wc, "word ", "s ")当输入中文本中                                            //word数大于一是在word后加s,为words为word的复数!}


九、equal_range(k)    //这个函数是容器所特有的,不是算法提供

1.返回一个迭代器类型的pair容器,第一个元素指向原容器的第一个键为k的迭代器,第二个元素指向原容器的最后一个键为k的下一个的迭代器,主要用来给multimap或multiset进行遍历的。

2.举例:

multimap<int,string> MapTemp;MapTemp.insert(make_pair(1,"huang"));MapTemp.insert(make_pair(1,"yong"));MapTemp.insert(make_pair(1,"hello"));MapTemp.insert(make_pair(4,"world"));MapTemp.insert(make_pair(5,"daxia"));for(auto pos = MapTemp.equal_range(1); pos.first != pos.second; ++pos.first ){cout<<"key:"<<pos.first->first<<" value: "<<pos.first->second<<endl;cout<<pos.second->second<<endl;//cout<<typeid(pos).name()<<endl;}
解释:在pos没进行相加操作的时候,pos.first指向的是MapTemp的第一个键为k的位置,pos.second指向的是最后一个键为k的元素的位置的下一个,也就是第MapTemp的第

四个位置。因此,进行相加操作便可以对键k对应的值的遍历。


十、inserter、back_inserter、front_inserter

1.功能:给一个容器进行元素插入

2.举例:

list<int> lst = {1,2,3,4};   //这样初始化在vs2010下通不过,估计要在vs2012上才能通过,没试过,能表达意思就行了。list<int> lst2,lst3;copy(lst.cbegin(),lst.cend(),front_inserter(lst2) );   //lst2将会是4,3,2,1copy(lst.cbegin(),lst.cend(),inserter(lst3,lst3.begin() ));    //lst3将会是1,2,3,4


原创粉丝点击