📅  最后修改于: 2023-12-03 15:13:11.429000             🧑  作者: Mango
<utility>
在 C++ 中在 C++ 中,<utility>
是一个常用的头文件,其中定义了一些常用的通用函数和类型。以下是该头文件中的一些常用功能:
std::pair
std::pair
是一个模板类,用于将两个值组合成一个值。它是由两个成员变量组成,分别为 first
和 second
。可以使用 std::make_pair
来创建一个 pair
对象。
示例:
#include <iostream>
#include <utility>
int main() {
std::pair<std::string, int> p1("Alice", 25);
auto p2 = std::make_pair("Bob", 30);
std::cout << p1.first << " " << p1.second << std::endl;
std::cout << p2.first << " " << p2.second << std::endl;
return 0;
}
输出:
Alice 25
Bob 30
std::swap
std::swap
是一个模板函数,用于交换两个对象的值。它的实现可以通过传递参数的引用来完成,也可以通过特化模板来提高性能。
示例:
#include <iostream>
#include <utility>
int main() {
int x = 10, y = 20;
std::swap(x, y);
std::cout << "x: " << x << std::endl;
std::cout << "y: " << y << std::endl;
return 0;
}
输出:
x: 20
y: 10
std::move
std::move
是一个模板函数,用于将一个对象的值转移到另一个对象中,通常用于转移指针或其他资源的所有权。它将对象的值视为右值,避免了拷贝构造函数的调用。
示例:
#include <iostream>
#include <utility>
int main() {
int x = 10;
int y = std::move(x);
std::cout << "x: " << x << std::endl;
std::cout << "y: " << y << std::endl;
return 0;
}
输出:
x: 10
y: 10
std::forward
std::forward
是一个模板函数,用于将参数转发给另一个函数。它可以保持参数的值类别不变,同时避免不必要的拷贝或移动操作。
示例:
#include <iostream>
#include <utility>
class Test {
public:
Test() = default;
Test(const Test& t) {
std::cout << "Copy constructor" << std::endl;
}
Test(Test&& t) {
std::cout << "Move constructor" << std::endl;
}
};
template<typename T>
void foo(T&& t) {
bar(std::forward<T>(t));
}
template<typename T>
void bar(T&& t) {
Test t1(std::forward<T>(t));
}
int main() {
Test t;
foo(t);
return 0;
}
输出:
Move constructor
以上是 <utility>
头文件中的一些常用功能,它们可以大大提高代码的简洁性和可读性。