首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 三元组 ADT 实现:模板类设计与基本运算

     編輯:關於C語言

抽象数据类型定义

三元组 = 任意类型的三个有序分量 (e1, e2, e3)。基本操作:

  • 构造/赋值
  • 按索引 (1-based) 读写分量
  • 求最大/最小分量
  • 分量求和
  • 按比例缩放
  • 输出显示
  • 销毁/重置

模板类实现(C++17)

#include <iostream>
#include <algorithm>
#include <stdexcept>
#include <array>

template <typename T>
class Triple {
    static_assert(std::is_arithmetic_v, "Triple requires arithmetic type");
    std::array<T, 3> data_;
public:
    constexpr Triple(T v1 = 0, T v2 = 0, T v3 = 0) : data_{v1, v2, v3} {}

    // 1-based 索引访问
    constexpr T get(int i) const {
        if (i < 1 || i > 3) throw std::out_of_range("Index 1..3");
        return data_[i-1];
    }
    constexpr void put(int i, T v) {
        if (i < 1 || i > 3) throw std::out_of_range("Index 1..3");
        data_[i-1] = v;
    }

    constexpr T max() const { return *std::max_element(data_.begin(), data_.end()); }
    constexpr T min() const { return *std::min_element(data_.begin(), data_.end()); }

    constexpr T sum(int i, int j) const { // 1-based
        if (i < 1 || i > 3 || j < 1 || j > 3) throw std::out_of_range("Index 1..3");
        return data_[i-1] + data_[j-1];
    }

    constexpr void scale(T s1, T s2, T s3) {
        data_[0] *= s1; data_[1] *= s2; data_[2] *= s3;
    }

    constexpr void reset() { data_.fill(0); }

    friend std::ostream& operator<<(std::ostream& os, const Triple& t) {
        os << '(' << t.data_[0] << ", " << t.data_[1] << ", " << t.data_[2] << ')';
        return os;
    }
};

测试程序

int main() {
    Triple<double> t(10, 33, -44);
    std::cout << "Initial: " << t << '\n';           // (10, 33, -44)
    std::cout << "get(1): " << t.get(1) << '\n';     // 10
    t.put(1, 55);
    std::cout << "After put(1,55): " << t << '\n';   // (55, 33, -44)
    std::cout << "max: " << t.max() << ", min: " << t.min() << '\n'; // 55, -44
    std::cout << "sum(1,3): " << t.sum(1, 3) << '\n'; // 11
    t.scale(0.1, 0.4, 0.5);
    std::cout << "After scale: " << t << '\n';       // (5.5, 13.2, -22)
    t.reset();
    std::cout << "After reset: " << t << '\n';       // (0, 0, 0)
    return 0;
}

设计亮点

  1. std::array:固定大小、栈分配、零开销、自带 begin/end/size 兼容算法。
  2. 1-based 索引:符合数学/教材习惯,内部转 0-based,边界检查抛异常。
  3. constexpr:所有操作可编译期求值。
  4. 算法复用:max_element/min_element 替代手写循环。
  5. 流输出:重载 operator<< 而非成员 Output(),符合 C++ 惯用法。
  6. 无动态内存:无需显式销毁,reset() 仅置零。

扩展建议

  • 加法/减法/点积:Triple operator+(const Triple&) 等。
  • 距离/范数:norm()、distance(const Triple&)。
  • 泛化为 Vector<N, T> 固定维向量,三元组为 Vector<3, T> 特化。
  • 支持 std::tuple 互转。

总结

三元组 ADT 虽简单,却是向量、点、颜色等几何实体的基础。使用 std::array、constexpr、算法库、流重载等现代 C++ 特性,可写出极简、高效、零开销的实现。面试或教学中,该例极适合展示“值类型设计、模板约束、异常安全、标准库复用”核心功力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved