15. STL-常用算法

img

5.1 常用遍历算法

img

for_each

for_each(iterator beg, iterator end,_func)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void print01(int val)
{
cout << val << " ";
}

class print02
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}

for_each(v.begin(), v.end(), print01);
cout << endl;
for_each(v.begin(), v.end(), print02());
cout << endl;
}

transform

img

搬运要提前开辟空间,否则无法搬运

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class TransForm
{
public:
int operator()(int v)
{
return v;
}
};
void test02()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
vector<int> t;
t.resize(v.size());
transform(v.begin(), v.end(), t.begin(),TransForm());
for_each(t.begin(), t.end(), print02());
}
img

5.2 常用查找算法

img

5.2.1 find

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
void test03()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
vector<int>::iterator it = find(v.begin(), v.end(), 5);
if (it == v.end())
{
cout << "don't" << endl;
}
else
{
cout << *it << endl;
}

for_each(v.begin(), v.end(), print02());
}

class Person
{
public:
Person(string mn, int ma) :name(mn), age(ma) {}

bool operator==(const Person&p)
{
if (this->name == p.name && this->age ==p.age)
{
return true;
}
return false;
}
string name;
int age;
};
void test04()
{
vector<Person> v;
Person p1("a", 10);
Person p2("b", 20);
Person p3("c", 30);
Person p4("d", 40);

v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);


Person pp("b", 20);
vector<Person>::iterator it = find(v.begin(), v.end(), pp);
if (it == v.end())
{
cout << "no" << endl;

}
else
{
cout << it->age << " " << it->name << endl;
}

}

5.2.2 find_if

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class GreaterFive
{
public:

bool operator()(int val)
{
return val > 5;
}
};
void test06()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
if (it == v.end())
{
cout << "don't" << endl;
}
else
{
cout << *it << endl;
}

for_each(v.begin(), v.end(), print02());
}

5.2.3 adjacant_find

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void test07()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
v.push_back(9);
vector<int>::iterator it = adjacent_find(v.begin(), v.end());
if (it == v.end())
{
cout << "don't" << endl;
}
else
{
cout << *it << endl;
}

for_each(v.begin(), v.end(), print02());
}
img
1
2
3
4
5
6
7
8
9
10
11
void test08()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
cout << binary_search(v.begin(), v.end(),9) << endl;

for_each(v.begin(), v.end(), print02());
}

5.2.5 count

img

要重载 ==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Person2
{
public:
Person2(string mn, int ma) :name(mn), age(ma) {}

bool operator==(const Person2& p)
{
if (this->age == p.age)
{
return true;
}
return false;
}
string name;
int age;
};
void test10()
{
vector<Person2> v;
Person2 p("zhang", 10);
for (int i = 0; i < 10; i++)
{
v.push_back(p);
}
Person2 p2("zhang", 10);
cout << count(v.begin(), v.end(), p2) << endl;

5.2.6 count_if

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void test11()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(20);
}
cout << count_if(v.begin(), v.end(), GreaterFive()) << endl;

for_each(v.begin(), v.end(), print02());
}
class Person3
{
public:
Person3(string mn, int ma) :name(mn), age(ma) {}


string name;
int age;
};

class Less20
{
public:
bool operator()(const Person3& p)
{
if (p.age < 20)
return true;
return false;
}
};
void test12()
{
vector<Person3> v;
Person3 p("zhang", 10);
for (int i = 0; i < 10; i++)
{
v.push_back(p);
}
cout << count_if(v.begin(), v.end(), Less20()) << endl;

}

5.3 常用排序算法

img

5.3.1 sort

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void test13()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
v.push_back(-2);
for_each(v.begin(), v.end(), print02());
cout << endl;

sort(v.begin(), v.end());
for_each(v.begin(), v.end(), print02());
cout << endl;

sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), print02());
cout << endl;

}

5.3.2 random_shuffle

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void test14()
{
srand((unsigned int)time(NULL));
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
v.push_back(-2);
for_each(v.begin(), v.end(), print02());
cout << endl;

random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), print02());
cout << endl;
}

5.3.3 merge

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void test15()
{
vector<int> v;
vector<int> t;
vector<int> vt;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for (int i = 0; i < 10; i++)
{
t.push_back(i+1);
}
// 提前分配空间
vt.resize(v.size() + t.size());
merge(v.begin(), v.end(), t.begin(), t.end(), vt.begin());
for_each(vt.begin(), vt.end(), print02());
cout << endl;
}

5.3.4 reverse

img
1
2
3
4
5
6
7
8
9
10
11
12
13
void test16()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}

// 提前分配空间
reverse(v.begin(), v.end());
for_each(v.begin(), v.end(), print02());
cout << endl;
}

5.4 常用拷贝和替换算法

img

5.4.1 copy

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void test17()
{
vector<int> v;
vector<int> t;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}

// 提前分配空间
t.resize(v.size());
copy(v.begin(), v.end(),t.begin());
for_each(t.begin(), t.end(), print02());
cout << endl;
}

5.4.2 replace

img
1
2
3
4
5
6
7
8
9
10
11
12
void test18()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}

replace(v.begin(), v.end(), 9,10);
for_each(v.begin(), v.end(), print02());
cout << endl;
}

5.4.3 replace_if

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void test18()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}

// 提前分配空间

replace_if(v.begin(), v.end(), GreaterFive(), 10);
for_each(v.begin(), v.end(), print02());
cout << endl;
}

5.4.4 swap

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void test20()
{
vector<int> v;
vector<int> t;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for (int i = 0; i < 10; i++)
{
t.push_back(i*2);
}
// 提前分配空间
swap(v, t);
for_each(v.begin(), v.end(), print02());
cout << endl;
for_each(t.begin(), t.end(), print02());
cout << endl;
}

5.5 常用算术生成算法

img

5.5.1accumulate

img
1
2
3
4
5
6
7
8
9
10
11
12
13
void test21()
{
vector<int> v;

for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
int total = accumulate(v.begin(),v.end(),0);
for_each(v.begin(), v.end(), print02());
cout << endl;
cout << total << endl;
}

5.5.2 fill

img
1
2
3
4
5
6
7
8
9
10
11
12
void test22()
{
vector<int> v;

for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
fill(v.begin(), v.end(), 20);
for_each(v.begin(), v.end(), print02());
cout << endl;
}

5.6常用集合算法

img

5.6.1 set intersection

img

返回值为交集最后一个元素的指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void test23()
{
vector<int> v;
vector<int> t;
vector<int> vt;

for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for (int i = 0; i < 10; i++)
{
t.push_back(i + 5);
}
vt.resize(min(v.size(), t.size()));
vector<int>::iterator it = set_intersection(v.begin(), v.end(), t.begin(), t.end(), vt.begin());
for_each(vt.begin(), it, print02());
cout << endl;
}

5.6.2 set_union

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void test24()
{
vector<int> v;
vector<int> t;
vector<int> vt;

for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for (int i = 0; i < 10; i++)
{
t.push_back(i + 5);
}
vt.resize((v.size()+t.size()));
vector<int>::iterator it = set_union(v.begin(), v.end(), t.begin(), t.end(), vt.begin());
for_each(vt.begin(), it, print02());
cout << endl;
}

5.6.3 set_diffrence

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void test25()
{
vector<int> v;
vector<int> t;
vector<int> vt;

for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for (int i = 0; i < 10; i++)
{
t.push_back(i + 5);
}
vt.resize(max(v.size() , t.size()));
vector<int>::iterator it = set_difference(v.begin(), v.end(), t.begin(), t.end(), vt.begin());
for_each(vt.begin(), it, print02());
cout << endl;
}

15. STL-常用算法
http://binbo-zappy.github.io/2024/11/27/cpp/15-STL-常用算法/
作者
Binbo
发布于
2024年11月27日
许可协议