STL——2.算法

一、遍历
1.for_each
void MyPrint(int val){
    cout << val << endl;
}

vector<int> v1 = {1, 2, 3, 4};

for_each(v1.begin(), v1.end(), MyPrint);
2.transform
v2.resize(v1.size());  //先开辟空间,否则报错
transform(v1,begin(), v1.end(), v2.begin(), MyPrint);
二、查找
1.find

找到并返回指定元素的迭代器,找不到返回end()。需要用迭代器来接收返回值。

vector<int>::iterator it = find(v1.begin(), v1.end(), 4);

if(it==v1.end()){
    cout << "未找到该元素" << endl;
}
else{
    cout << "找到该元素" << endl;
}
2.find_if
class GreaterFive {
public:
	bool operator()(int val) {
		return val > 2;
	}
};

vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
if (it == v.end()) {
	cout << "未找到该元素!" << endl;
}
else {
	cout << "找到该元素:" << *it << endl;
}
 3.adjacent_find

查找相邻重复元素,返回相邻元素的第一个位置的迭代器,找不到返回结束迭代器。

vector<int> v2 = {1, 2, 3, 3, 4};
vector<int>::iterator it = adjacent(v2.begin(),v2.end());
if(it == v.end()){
    cout << "未找到相邻重复元素!" << endl();
}
else{
    cout << "找到相邻重复元素:" << *it << endl;  //找到3
}
4.binary_search

查找指定元素,找到返回true,没找到返回false。(仅适用于有序序列)

vector<int> v1 = {1, 2, 3, 4};

bool ret = binary_search(v.begin(), v.end(), 4);
if(ret){
    cout << "找到该元素!" << endl;
}
else{
    cout << "未找到该元素!" << endl;
}
5.count

统计元素个数

vector<int> v1 = {1, 2, 3, 3, 3, 3, 4};

int num = v1.count(v1.begin(), v1.end(), 3); //结果返回4
6.count_if
vector<int> v1 = {1, 2, 3, 3, 3, 3, 4};
class greater3 {
public:
	bool operator()(int val){
		return val == 3;
	}
};

int num = v1.count_if(v1.begin(),v1.end(),greater3()); //返回3的数量4
三、排序
1.sort
vector<int> v1 = {1, 2, 6, 8, 5, 3, 4};


void myPrint(int val) {
	cout << val << " ";
}

sort(v1.begin(),v1.end(),myPrint); //升序,第三个参数可要可不要
sort(v1.begin(),v1.end(),greater<int>()); //降序
2.random_shuffle
vector<int> v1 = {1, 2, 6, 8, 5, 3, 4};

srand((unsigned int)time(NULL)); //加上随机数种子
random_shufflle(v1.begin(),v1.end());
3.merge

两个容器必须是有序的,合并之后也是一个有序序列。

vector<int> v1 = {1, 2, 6, 8, 5, 3, 4};
vector<int> v2 = {7, 7, 9, 14, 12, 11, 10};
vector<int> v;

merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v.begin());
4.reverse

将容器内的元素反转。 

reverse(v1.begin(),v1.end());
四、拷贝和替换
1.copy

把容器内指定范围内元素拷贝到另一容器中,另一容器要提前开辟空间。

vector<int> v1 = {1, 2, 6, 8, 5, 3, 4};
vector<int> v;
v.resize(v1.size());

copy(v1.begin(),v1.end(),v.begin());
2.replace 

将容器内指定范围的旧元素修改为新元素。

replace(v1.begin(),v1.end(),2,20);
//把v1内的2全部换成20
3.replace_if

 将容器内指定范围满足条件的元素替换成新元素。

class MyPrint{
public:
    void operator(int val){
        cout << val << " ";
    }
};

replace(v1.begin(),v1.end(),MyPrint());
4.swap

 互换两个容器的元素。

swap(v1,v2);
五、算数生成
1.accumulate

计算区间内容器元素累计总和

accumulate(v1.begin(),v1.end(),0); //累加的起始值为0
2.fill

向容器中填充指定的值

fill(v1.begin(),v1.end(),100);
六、集合
1.set_intersection

求两个容器的交集,两个集合必须是有序序列,返回值是交集中最后一个元素的迭代器位置。目标容器开辟空间需要从两个容器中取小值。

vector<int> v1 = {1, 2, 6, 8, 5, 3, 7};
vector<int> v2 = {7, 7, 9, 14, 12, 11, 10};
vector<int> v;

vector<int>::iterator it1;
it1 = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),v.begin());
2.set_union

求两个容器的并集,两个集合必须是有序序列,返回值是并集中最后一个元素迭代器位置。目标容器开辟空间需要取两个容器的大小之和。

vector<int> v1 = {1, 2, 6, 8, 5, 3, 7};
vector<int> v2 = {7, 7, 9, 14, 12, 11, 10};
vector<int> v;

vector<int>::iterator it2;
it2 = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),v.begin());
3.set_difference

求两个容器的差集。两个集合必须是有序序列,返回差集中最后一个元素的迭代器位置。

vector<int> v1 = {1, 2, 6, 8, 5, 3, 7};
vector<int> v2 = {7, 7, 9, 14, 12, 11, 10};
vector<int> v_1;
vector<int> v_2;

vector<int>::iterator it1;
vector<int>::iterator it2;
it1 = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),v_1.begin());
it2 = set_intersection(v2.begin(),v2.end(),v1.begin(),v1.end(),v_2.begin());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值