目录
copy
replace
replace_if
swap
常用拷贝和替换算法简介:
- copy 容器内指定范围的元素拷贝到另一个容器
- replace 容器内指定范围的旧元素改为新元素
- replace_if 容器内指定范围满足条件的元素替换为新元素
- swap 互换两个容器的元素
copy
功能:
- 容器内指定范围的元素拷贝到另一个容器
函数原型:
copy(iterator beg, iterator end, iterator dest);
beg —— 开始迭代器
end —— 结束迭代器
dest —— 目标迭代器
功能:
- 容器内指定范围的元素拷贝到另一个容器
函数原型:
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 void PrintVector(const T& x) { cout << x << " "; } // 内置数据类型拷贝 void test01() { vector v; for (int i = 0; i < 10; ++i) { v.push_back(i); } for_each(v.begin(), v.end(), PrintVector ); // 遍历 cout << endl; 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 ); // 遍历 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
功能:
- 将容器内指定范围的旧元素(所有相同的)修改为新元素
函数原型:
replace(iterator beg, iterator end, oldvalue, newvalue);
beg —— 开始迭代器
end —— 结束迭代器
oldvalue —— 旧元素
newvalue —— 新元素
功能:
- 将容器内指定范围的旧元素(所有相同的)修改为新元素
函数原型:
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 void PrintVector(const T& x) { cout << x << " "; } // 内置数据类型替换 void test01() { vector 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 ); // 遍历 cout << endl; cout << "——替换后——" << endl; replace(v.begin(), v.end(), 30, 20); // 替换 for_each(v.begin(), v.end(), PrintVector ); // 遍历 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
功能:
- 将区间内满足条件的元素,替换成指定元素
函数原型:
replace_if(iterator beg, iterator end, _Pred, newvalue);
beg —— 开始迭代器
end —— 结束迭代器
_Pred —— 谓词
newvalue —— 替换的新元素
功能:
- 将区间内满足条件的元素,替换成指定元素
函数原型:
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 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 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 ); // 遍历 cout << endl; cout << "——替换后——" << endl; replace_if(v.begin(), v.end(), replace_int(), 18); // >= 18 替换 for_each(v.begin(), v.end(), PrintVector ); // 遍历 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
功能:
- 互换同种类型的容器
函数原型:
swap(container c1, container c2);
c1 —— 容器1
c2 —— 容器2
功能:
- 互换同种类型的容器
函数原型:
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 void PrintVector(const T& x) { cout << x << " "; } // 内置数据类型交换 void test01() { vector v1; vector 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 ); cout << endl; cout << "v2:"; for_each(v2.begin(), v2.end(), PrintVector ); cout << endl; cout << "——交换后——" << endl; swap(v1, v2); cout << "v1:"; for_each(v1.begin(), v1.end(), PrintVector ); cout << endl; cout << "v2:"; for_each(v2.begin(), v2.end(), PrintVector ); 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 必须是同种容器交换



