C++——STL标准模板库——常用算法归纳

使用标准模板库提供的算法需要包含头文件:algorithm,其中包含了遍历、查找、排序、拷贝和替换等算法。当容器储存内置数据类型可使用STL提供函数对象,当容器储存自定义数据类型时需要自定义数据对象或者函数用于提供自定义数据类型的比较、计算、赋值等操作。

一、遍历算法

1、for_each(iterator begin,iterator end,Fun _func);

遍历[begin,end)区间内的元素,通过函数_func操作元素,例如输出、计算、重新赋值等;_func可以是函数指针,也可以是函数对象,只能是一元函数。返回_func。

2、transform

        重载1:transform(iterator begin,iterator end,iterator destbegin,_func);遍历[begin,end)区间内的元素,经过_func(函数对象或函数)处理后,复制到destbegin迭代器指向的容器,返回destbegin迭代器;_func是一元函数。

        重载2:transform(iterator begin1,iterator end1,iterator begin2,iterator destbegin,_func);遍历[begin1,end1)区间内的元素,通过_func函数与begin2后面的元素逐一处理,复制到destbegin迭代器指向的位置,返回destbegin迭代器;_func是二元函数。

int main() {
	vector<int> v1 = { 1,2,3,3,4,4,5 };
	vector<int> v2 = { 2,3,4,4,5,5,6 };
	vector<int> dest(v1.size());

	transform(v2.begin(), v2.end(), v1.begin(), dest.begin(), minus<int>());
	
	for (auto value : dest) {
		cout << value << " ";
	}
	return 0;
}

二、查找算法

1、查找指定元素

        find(iterator begin,iterator end,const T&value);超找[begin,end)区间内是否存在value,存在返回迭代器,不存在返回end。

2、查找第一个满足条件元素

        find_if(iterator begin,iterator end,_Pre _pred);查找[begin,end)区间内第一个满足函数_pred的元素,存在返回迭代器,不存在返回end。_pred是一元函数。

3、查找满足条件的相邻元素

        重载一:adjacent_find(iterator begin,iterator end);查找[begin,end)区间中第一个相邻并相等的元素,返回迭代器,没有的话返回end。

        重载二:adjacent_find(iterator begin,iterator end, Pre _pred);重载可提供为第三个参数提供一个二元谓词或者二元函数,用于判断相邻两个元素是否满足指定条件。返回第一个满足条件元素的迭代器。

class compare {
public:
	bool operator()(const int&a, const int&b) {
		return a > b;
	}
};
int main() {
	vector<int> v = { 1, 2, 3, 3, 4, 4, 5 };
	auto it = adjacent_find(v.begin(), v.end(), compare());
	cout << *it << endl;
	return 0;
}

4、二分查找

        重载1:bool binary_search(iterator begin,iterator end,const T&value); 查找递增区间[begin,end)内有没有value,返回bool类型。

        重载2:bool binary_search(iterator begin,iterator end,const T&value, _Pr pred);查找满足pred比较方法的容器中是否存在和value相等的元素。pred一般为自定义类型的比较方法,可升序可降序

class Person {
public:
	string _name;
	int _age;
	Person() {}
	Person(string name,int age):_name(name),_age(age){}
	bool operator==(const Person& p) {
		return this->_name == p._name&&this->_age == p._age;
	}
};
class Compareless {
public:
	bool operator()(const Person&p1, const Person&p2) {
		return p1._age < p2._age;
	}
};
class Comparegreat {
public:
	bool operator()(const Person&p1,const Person&p2) {
		return p1._age > p2._age;
	}
};
class printPerson {
public:
	void operator()(Person& p) {
		cout << "姓名:" << setw(10) <<setiosflags(ios::left) << p._name << "  年龄:" << p._age << endl;
	}
};
int main() {
	vector<Person> v;
	v.push_back(Person("zhangsan", 15));
	v.push_back(Person("lis", 17));
	v.push_back(Person("wangwu", 14));
	v.push_back(Person("zhaoliu", 20));
	v.push_back(Person("chenqi", 21));
	v.push_back(Person("zhouba", 19));
	v.push_back(Person("wujiu", 15));
	v.push_back(Person("haner", 30));
	sort(v.begin(), v.end(), Compareless());
	for_each(v.begin(), v.end(), printPerson()); 
	cout << binary_search(v.begin(), v.end(), Person("wujiu", 15),Compareless()) << endl;

	sort(v.begin(), v.end(), Comparegreat());
	for_each(v.begin(), v.end(), printPerson());
	cout << binary_search(v.begin(), v.end(), Person("wujiu", 15), Comparegreat()) << endl;

	return 0;
}

二分查找适用于前面学过的每个容器的有序序列,需要保持查找函数比较方法和容器一致。

5、统计

        int count(iterator begin,iterator end,const T&value);统计value在区间[begin,end)内出现次数。

        int count_if(iterator begin,iterator end, Pred _pred);统计value在区间[begin,end)内满足_pred条件的元素个数

三、排序算法

1、sort(iterator begin,iterator end);对区间[begin,end)内元素进行默认递增排序。

      sort(iterator begin,iterator end,greater<T>());对区间[begin,end)内元素进行递减排序。

      对于自定义数据类型,需要自定义排序谓词。

2、random_shuffle(iterator begin,iterator end);  洗牌:随机排序。调用时需要设置一个随机种子,否则每次排序结果不变。

class print {
public:
	void operator()(const int&a) {
		cout << a << " ";
	}
};
int main() {
	vector<int> v1 = { 1,2,3,4,5 };
	srand((unsigned int)time(NULL));
	random_shuffle(v1.begin(), v1.end());
	for_each(v1.begin(), v1.end(), print());
	return 0;
}

3、merge(iterator begin1,iterator end1,iterator begin2,iterator end2,iterator dest);合并两个序列复制到dest迭代器指向的位置。需要注意的是dest所在容器需要先申请空间,否则合并失败。一般合并的两个序列是有序的。

4、reverse(iterator begin,iterator end); 翻转指定区间。

四、拷贝和替换算法

1、copy(iterator begin,iterator end,iterator dest);将[begin,end)复制到dest。dest所在容器需要先申请空间。

2、replace(iterator begin,iterator end,T& oldval,T& newval); 将[begin,end)内的oldval替换为newval。

3、replace_if(iterator begin,iterator end,Pred pred,T&newval);将[begin,end)内满足pred条件的元素替换为newval。

4、swap(Container& c1,Container& c2); 交换两个容器的内容,此交换函数可交换两个任意相同类型的变量。

五、算术生成算法

1、accumulate(iterator begin,iterator end,int cnt);  将[begin,end)内的元素,在cnt的基础上累加

2、fill(iterator begin,iterator end,const T&value);  将[begin,end)内填充为value

此两个算法需要包含头文件<numeric>

六、常用集合算法

1、求交集:iterator set_intersection(iterator begin1,iterator end1,iterator begin2,iterator end2,iterator dest);求两个有序集合的交集,复制到dest指向的新容器中,dest指向的容器需要先申请储存空间,一般为两个容器中较小的size。返回交集的结束迭代器。

2、求并集:iterator set_union(iterator begin1,iterator end1,iterator begin2,iterator end2;iterator dest);求两个有序集合的并集,复制到dest指向的新容器中,dest指向的容器需要先申请储存空间,大小为两个容器size之和。

3、求差集:iterator set_difference(iterator begin1,iterator end1,iterator begin2,iterator end2,iterator dest);求有序集合1[begin1,end1)相对于有序集合2[begin2,end2)的差集,也就是1中有2中没有的元素,储存到dest迭代器指向的容器。

此三个集合算法要求集合必须是有序的,dest容器也是有序的,默认递增。

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值