目录
常用拷贝和替换算法简介:
- copy 容器内指定范围的元素拷贝到另一个容器
- replace 容器内指定范围的旧元素改为新元素
- replace_if 容器内指定范围满足条件的元素替换为新元素
- swap 互换两个容器的元素
copy
功能:
- 容器内指定范围的元素拷贝到另一个容器
函数原型:
copy(iterator beg, iterator end, iterator dest);
beg —— 开始迭代器
end —— 结束迭代器
dest —— 目标迭代器
测试代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
class Person {
public:
Person(string name, int age) :m_Name(name), m_Age(age) {}
Person() {}
string m_Name;
int m_Age;
};
ostream& operator<<(ostream& cout, const Person& p) {
cout << p.m_Name << " " << p.m_Age << endl;
return cout;
}
template<typename T>
void PrintVector(const T& x) {
cout << x << " ";
}
// 内置数据类型拷贝
void test01() {
vector<int>v;
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
cout << endl;
vector<int>v_target; // 目标容器
v_target.resize(v.size()); // 目标容器重置大小
copy(v.begin(), v.end(), v_target.begin()); // 拷贝
for_each(v_target.begin(), v_target.end(), PrintVector<int>); // 遍历
cout << endl;
}
// 自定义数据类型拷贝
void test02() {
vector<Person>v;
Person p1("张三", 18);
Person p2("李四", 19);
Person p3("王五", 20);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
for_each(v.begin(), v.end(), PrintVector<Person>);
vector<Person>v_target; // 目标容器
v_target.resize(v.size()); // 目标容器重置大小
copy(v.begin(), v.end(), v_target.begin()); // 拷贝
for_each(v_target.begin(), v_target.end(), PrintVector<Person>);
}
int main() {
test01();
test02();
system("pause");
return 0;
}
运行结果:
copy 将原容器区间中的元素拷贝到新空间时需要用 resize 开辟内存空间。
copy 和 vector 内置数据类型 直接用 = 的区别在于可以指定区间,另外 用 = 直接赋值自定义数据类型时需要重载 =
replace
功能:
- 将容器内指定范围的旧元素(所有相同的)修改为新元素
函数原型:
replace(iterator beg, iterator end, oldvalue, newvalue);
beg —— 开始迭代器
end —— 结束迭代器
oldvalue —— 旧元素
newvalue —— 新元素
测试代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
class Person {
public:
Person(string name, int age) :m_Name(name), m_Age(age) {}
// 重载 ==,replace 底层代码需要对比
bool operator==(const Person& p) {
return (p.m_Name == this->m_Name && p.m_Age == this->m_Age);
}
string m_Name;
int m_Age;
};
// 重载 <<
ostream& operator<<(ostream& cout, const Person& p) {
cout << p.m_Name << " " << p.m_Age << endl;
return cout;
}
template<typename T>
void PrintVector(const T& x) {
cout << x << " ";
}
// 内置数据类型替换
void test01() {
vector<int>v;
v.push_back(10);
v.push_back(30);
v.push_back(30);
v.push_back(40);
cout << "——替换前——" << endl;
for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
cout << endl;
cout << "——替换后——" << endl;
replace(v.begin(), v.end(), 30, 20); // 替换
for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
cout << endl;
}
// 自定义数据类型替换
void test02() {
vector<Person>v;
Person p1("A", 16);
Person p2("B", 17);
Person p3("D", 19);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
cout << "——替换前——" << endl;
for_each(v.begin(), v.end(), PrintVector<Person>); // 遍历
cout << "——替换后——" << endl;
Person p4("C", 18);
replace(v.begin(), v.end(), p3, p4); // 替换
for_each(v.begin(), v.end(), PrintVector<Person>); // 遍历
}
int main() {
test01();
test02();
system("pause");
return 0;
}
运行结果:
replace_if
功能:
- 将区间内满足条件的元素,替换成指定元素
函数原型:
replace_if(iterator beg, iterator end, _Pred, newvalue);
beg —— 开始迭代器
end —— 结束迭代器
_Pred —— 谓词
newvalue —— 替换的新元素
测试代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class Person {
public:
Person(string name, int age) :m_Name(name), m_Age(age) {
if (age >= 18) this->m_Adult = true;
else this->m_Adult = false;
}
string m_Name;
int m_Age;
bool m_Adult; // 是否成年
};
// 重载 <<
ostream& operator<<(ostream& cout, const Person& p) {
string if_Adult = p.m_Adult ? "成年" : "未成年";
cout << p.m_Name << " " << p.m_Age << " " << if_Adult << endl;
return cout;
}
template<typename T>
void PrintVector(const T& x) {
cout << x << " ";
}
// 替换整形的仿函数
class replace_int {
public:
bool operator()(const int& x) {
return (x >= 18);
}
};
// 替换 Person 的仿函数
class replace_Person {
public:
bool operator()(const Person& p) {
return (p.m_Adult == false);
}
};
// 内置数据类型选择替换
void test01() {
vector<int>v;
v.push_back(15);
v.push_back(17);
v.push_back(25); // √
v.push_back(18); // √
v.push_back(20); // √
cout << "——替换前——" << endl;
for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
cout << endl;
cout << "——替换后——" << endl;
replace_if(v.begin(), v.end(), replace_int(), 18); // >= 18 替换
for_each(v.begin(), v.end(), PrintVector<int>); // 遍历
cout << endl;
}
// 自定义数据类型条件替换
void test02() {
vector<Person>v;
Person p1("A", 16); // √
Person p2("B", 17); // √
Person p3("C", 18);
Person p4("D", 19);
Person p5("E", 20);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
cout << "——替换前——" << endl;
for_each(v.begin(), v.end(), PrintVector<Person>); // 遍历
cout << "——替换后——" << endl;
Person R_p("*", 0);
replace_if(v.begin(), v.end(), replace_Person(), R_p); // 将未成年信息替换
for_each(v.begin(), v.end(), PrintVector<Person>); // 遍历
}
int main() {
test01();
test02();
system("pause");
return 0;
}
运行结果:
swap
功能:
- 互换同种类型的容器
函数原型:
swap(container c1, container c2);
c1 —— 容器1
c2 —— 容器2
测试代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
class Person {
public:
Person(string name, int age) :m_Name(name), m_Age(age) {}
string m_Name;
int m_Age;
};
ostream& operator<<(ostream& cout, const Person& p) {
cout << p.m_Name << " " << p.m_Age << endl;
return cout;
}
template<typename T>
void PrintVector(const T& x) {
cout << x << " ";
}
// 内置数据类型交换
void test01() {
vector<int>v1;
vector<int>v2;
for (int i = 0; i < 10; ++i) {
v1.push_back(i);
}
for (int i = 10; i > 0; --i) {
v2.push_back(i);
}
cout << "——交换前——" << endl;
cout << "v1:";
for_each(v1.begin(), v1.end(), PrintVector<int>);
cout << endl;
cout << "v2:";
for_each(v2.begin(), v2.end(), PrintVector<int>);
cout << endl;
cout << "——交换后——" << endl;
swap(v1, v2);
cout << "v1:";
for_each(v1.begin(), v1.end(), PrintVector<int>);
cout << endl;
cout << "v2:";
for_each(v2.begin(), v2.end(), PrintVector<int>);
cout << endl;
}
// 自定义数据类型交换
void test02() {
vector<Person>v1;
Person p1("A", 19);
Person p2("B", 20);
Person p3("C", 21);
v1.push_back(p1);
v1.push_back(p2);
v1.push_back(p3);
vector<Person>v2;
Person p4("D", 22);
Person p5("E", 23);
Person p6("F", 24);
Person p7("G", 25);
v2.push_back(p4);
v2.push_back(p5);
v2.push_back(p6);
v2.push_back(p7);
cout << "——交换前——" << endl;
cout << "v1: " << endl;
for_each(v1.begin(), v1.end(), PrintVector<Person>);
cout << "v2: " << endl;
for_each(v2.begin(), v2.end(), PrintVector<Person>);
cout << "——交换后——" << endl;
swap(v1, v2);
cout << "v1: " << endl;
for_each(v1.begin(), v1.end(), PrintVector<Person>);
cout << "v2: " << endl;
for_each(v2.begin(), v2.end(), PrintVector<Person>);
}
int main() {
test01();
test02();
system("pause");
return 0;
}
运行结果:
swap 必须是同种容器交换