三元组 = 任意类型的三个有序分量 (e1, e2, e3)。基本操作:
#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;
}
begin/end/size 兼容算法。max_element/min_element 替代手写循环。operator<< 而非成员 Output(),符合 C++ 惯用法。reset() 仅置零。Triple operator+(const Triple&) 等。norm()、distance(const Triple&)。Vector<N, T> 固定维向量,三元组为 Vector<3, T> 特化。std::tuple 互转。三元组 ADT 虽简单,却是向量、点、颜色等几何实体的基础。使用 std::array、constexpr、算法库、流重载等现代 C++ 特性,可写出极简、高效、零开销的实现。面试或教学中,该例极适合展示“值类型设计、模板约束、异常安全、标准库复用”核心功力。