目录
常用拷贝和替换算法简介:
- copy 容器内指定范围的元素拷贝到另一个容器
- replace 容器内指定范围的旧元素改为新元素
- replace_if 容器内指定范围满足条件的元素替换为新元素
- swap 互换两个容器的元素
功能:
- 容器内指定范围的元素拷贝到另一个容器
函数原型:
copy(iterator beg, iterator end, iterator dest);beg —— 开始迭代器
end —— 结束迭代器
dest —— 目标迭代器
测试代码:
- #include
- #include
- #include
- #include
- 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
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
); -
- vector
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 main() {
- test01();
- test02();
- system("pause");
- return 0;
- }
运行结果:

copy 将原容器区间中的元素拷贝到新空间时需要用 resize 开辟内存空间。
copy 和 vector 内置数据类型 直接用 = 的区别在于可以指定区间,另外 用 = 直接赋值自定义数据类型时需要重载 =
功能:
- 将容器内指定范围的旧元素(所有相同的)修改为新元素
函数原型:
replace(iterator beg, iterator end, oldvalue, newvalue);beg —— 开始迭代器
end —— 结束迭代器
oldvalue —— 旧元素
newvalue —— 新元素
测试代码:
- #include
- #include
- #include
- #include
- 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
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
); // 遍历 -
- cout << "——替换后——" << endl;
- Person p4("C", 18);
- replace(v.begin(), v.end(), p3, p4); // 替换
- for_each(v.begin(), v.end(), PrintVector
); // 遍历 - }
-
- int main() {
- test01();
- test02();
- system("pause");
- return 0;
- }
运行结果:

功能:
- 将区间内满足条件的元素,替换成指定元素
函数原型:
replace_if(iterator beg, iterator end, _Pred, newvalue);beg —— 开始迭代器
end —— 结束迭代器
_Pred —— 谓词
newvalue —— 替换的新元素
测试代码:
- #include
- #include
- #include
- #include
- 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
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
); // 遍历 -
- cout << "——替换后——" << endl;
- Person R_p("*", 0);
- replace_if(v.begin(), v.end(), replace_Person(), R_p); // 将未成年信息替换
- for_each(v.begin(), v.end(), PrintVector
); // 遍历 - }
-
- int main() {
- test01();
- test02();
- system("pause");
- return 0;
- }
运行结果:

功能:
- 互换同种类型的容器
函数原型:
swap(container c1, container c2);c1 —— 容器1
c2 —— 容器2
测试代码:
- #include
- #include
- #include
- #include
- 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
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
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
); - cout << "v2: " << endl;
- for_each(v2.begin(), v2.end(), PrintVector
); -
- cout << "——交换后——" << endl;
- swap(v1, v2);
- cout << "v1: " << endl;
- for_each(v1.begin(), v1.end(), PrintVector
); - cout << "v2: " << endl;
- for_each(v2.begin(), v2.end(), PrintVector
); - }
-
- int main() {
- test01();
- test02();
- system("pause");
- return 0;
- }
运行结果:

swap 必须是同种容器交换