📜  C++ 中元组的二维向量及示例(1)

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

C++ 中元组的二维向量及示例

在 C++ 中,元组(tuple)是一种允许将一组值组合成单个对象的数据结构。当我们需要处理多个相关但不同类型的数据时,元组可以帮助我们更方便地进行操作。在本篇文章中,我们将探讨如何利用元组实现二维向量,并提供相应的示例代码。

实现思路

要实现二维向量,我们需要定义一个元组,其中每个元素本身也是一个元组,代表一个二维向量的一个坐标。为了方便,我们将每个坐标的类型都定为 int 类型。在 C++ 中,我们可以用 std::tuple 来定义元组,例如:

std::tuple<int, int> coord = {1, 2};

这表示一个二维向量的 x 坐标为 1,y 坐标为 2。如果我们要定义一个元组,其中的元素本身也是一个元组,可以像这样:

std::tuple<std::tuple<int, int>, std::tuple<int, int>> vec = {{1, 2}, {3, 4}};

这表示一个二维向量包含两个坐标,分别为 (1, 2) 和 (3, 4)。

接下来,我们可以定义一个类来封装这个二维向量,并实现一些常见的向量操作,比如加减乘除等。完整的代码如下:

#include <tuple>

class Vec2 {
public:
    Vec2(int x1, int y1, int x2, int y2) : coords(x1, y1, x2, y2) {}

    Vec2 operator+(const Vec2& other) const {
        auto [x1, y1, x2, y2] = coords;
        auto [ox1, oy1, ox2, oy2] = other.coords;
        return Vec2{x1+ox1, y1+oy1, x2+ox2, y2+oy2};
    }

    Vec2 operator-(const Vec2& other) const {
        auto [x1, y1, x2, y2] = coords;
        auto [ox1, oy1, ox2, oy2] = other.coords;
        return Vec2{x1-ox1, y1-oy1, x2-ox2, y2-oy2};
    }

    Vec2 operator*(int scalar) const {
        auto [x1, y1, x2, y2] = coords;
        return Vec2{x1*scalar, y1*scalar, x2*scalar, y2*scalar};
    }

    Vec2 operator/(int scalar) const {
        auto [x1, y1, x2, y2] = coords;
        return Vec2{x1/scalar, y1/scalar, x2/scalar, y2/scalar};
    }

    int dot(const Vec2& other) const {
        auto [x1, y1, x2, y2] = coords;
        auto [ox1, oy1, ox2, oy2] = other.coords;
        return x1*ox1 + y1*oy1 + x2*ox2 + y2*oy2;
    }

    std::tuple<int, int, int, int> getCoords() const {
        return coords;
    }

private:
    std::tuple<int, int, int, int> coords;
};

在这个类中,我们首先定义了一个构造函数,接受四个 int 类型的参数,分别表示两个坐标的 x 和 y 坐标值。之后我们重载了加减乘除运算符(+、-、* 和 /),以及定义了点积(dot)运算。最后,我们还提供了一个公共方法 getCoords(),返回这个向量的四个坐标值。

示例代码

我们使用这个类定义两个二维向量,并对其进行加减乘除和点积运算。示例如下:

#include <iostream>

int main() {
    Vec2 v1{1, 2, 3, 4};
    Vec2 v2{5, 6, 7, 8};

    auto v3 = v1 + v2;
    auto v4 = v1 - v2;
    auto v5 = v1 * 2;
    auto v6 = v2 / 2;
    auto dot = v1.dot(v2);

    auto [x1, y1, x2, y2] = v3.getCoords();
    std::cout << "v1 + v2 = {" << x1 << ", " << y1 << ", " << x2 << ", " << y2 << "}\n";
    std::tie(x1, y1, x2, y2) = v4.getCoords();
    std::cout << "v1 - v2 = {" << x1 << ", " << y1 << ", " << x2 << ", " << y2 << "}\n";
    std::tie(x1, y1, x2, y2) = v5.getCoords();
    std::cout << "v1 * 2 = {" << x1 << ", " << y1 << ", " << x2 << ", " << y2 << "}\n";
    std::tie(x1, y1, x2, y2) = v6.getCoords();
    std::cout << "v2 / 2 = {" << x1 << ", " << y1 << ", " << x2 << ", " << y2 << "}\n";
    std::cout << "v1 . v2 = " << dot << "\n";

    return 0;
}

这段代码将输出以下内容:

v1 + v2 = {6, 8, 10, 12}
v1 - v2 = {-4, -4, -4, -4}
v1 * 2 = {2, 4, 6, 8}
v2 / 2 = {2, 3, 3, 4}
v1 . v2 = 70

以上就是使用元组实现二维向量的方法及示例代码。希望能对你有所帮助!