一、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> ve ve.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,1 copy(lst.cbegin(),lst.cend(),inserter(lst3,lst3.begin() )); //lst3将会是1,2,3,4