📜  <utility>在C++中(1)

📅  最后修改于: 2023-12-03 15:13:11.429000             🧑  作者: Mango

<utility> 在 C++ 中

在 C++ 中,<utility> 是一个常用的头文件,其中定义了一些常用的通用函数和类型。以下是该头文件中的一些常用功能:

1. std::pair

std::pair 是一个模板类,用于将两个值组合成一个值。它是由两个成员变量组成,分别为 firstsecond。可以使用 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
2. 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
3. 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
4. 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> 头文件中的一些常用功能,它们可以大大提高代码的简洁性和可读性。