swap互换

本文介绍了C++中如何使用`swap`函数进行容器(如vector)的交换,并强调了在操作时确保两个容器类型相同的必要性。通过示例展示了`swap`在`vector<int>`中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例:

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//常用拷贝和替换算法 swap
void myPrint(int val)
{
	cout << val << " ";
}
void test01()
{
	vector<int>v1;
	vector<int>v2;

	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 1000);
	}

	cout << "交换前:" << endl;
	for_each(v1.begin(), v1.end(), myPrint);
	cout << endl;
	for_each(v2.begin(), v2.end(), myPrint);
	cout << endl;

	swap(v1, v2);
	cout << "交换后:" << endl;
	for_each(v1.begin(), v1.end(), myPrint);
	cout << endl;
	for_each(v2.begin(), v2.end(), myPrint);
	cout << endl;
}
int main()
{
	test01();
	return 0;
}

总结:swap容器交换时,要注意交换的容器是同种类型

05-18
### Swap 函数或方法的定义与用法 在编程领域,`swap` 是一种常见的操作,主要用于交换两个变量的内容。这一过程可以通过内置库函数、模板函数或自定义实现完成。以下是关于 `swap` 的具体定义及其用法的详细介绍。 --- #### **Swap 的基本概念** `swap` 操作的核心目标是将两个变量的值互换。例如,在 C++ 编程语言中,`std::swap` 提供了一种通用的方式来进行这样的交换[^4]。然而,当默认实现无法满足特定类的需求时(如涉及 Pimpl 模式的类),需要定制化的解决方案[^3]。 --- #### **C++ 中的标准 `std::swap` 实现** 标准库中的 `std::swap` 通常是泛型的,适用于大多数基础数据类型和简单对象。其实现方式如下所示: ```cpp template<typename T> void swap(T& a, T& b) { T temp = std::move(a); // 移动语义提升性能 a = std::move(b); b = std::move(temp); } ``` 这段代码展示了如何通过临时变量来交换两个对象的值。尽管这种方式有效,但对于某些复杂类来说可能会带来不必要的开销,因此需要进一步优化[^1]。 --- #### **针对特定类的高效 `swap` 方法** 为了提高效率并减少资源消耗,许多现代设计提倡为特定类提供专门的 `swap` 方法。这些方法通常遵循以下模式: 1. **成员函数形式 (`member swap`):** 类本身应包含一个公共成员函数 `swap`,负责快速交换实例的状态。例如: ```cpp class Widget { private: int* pImpl; // 假设这是指向内部状态的指针 public: void swap(Widget& other) noexcept { // 确保不会抛出异常 using std::swap; swap(pImpl, other.pImpl); } }; ``` 此处利用了局部作用域内的 `using std::swap` 来确保即使存在重载也能正确调用标准版本[^3]。 2. **非成员函数形式 (`non-member swap`):** 在同一命名空间下定义一个自由函数 `swap`,以便外部代码可以直接调用而不需显式指定类名前缀。该函数只需转发至对应的成员函数即可: ```cpp namespace MyNamespace { inline void swap(Widget& lhs, Widget& rhs) { lhs.swap(rhs); // 调用上面定义的成员函数 } } ``` 3. **特化 `std::swap`:** 对于非模板类,可以选择为其特化全局范围内的 `std::swap`,从而无缝集成到 STL 容器或其他算法之中。注意这一步仅限于具体的类而非模板类[^3]。 ```cpp namespace std { template<> void swap<Widget>(Widget& lhs, Widget& rhs) { lhs.swap(rhs); // 再次委托给成员函数 } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值