现在的位置: 首页 > 综合 > 正文

STL算法学习

2013年07月19日 ⁄ 综合 ⁄ 共 3246字 ⁄ 字号 评论关闭

一、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

抱歉!评论已关闭.