如何用cin正确读取自定义vec2d类型的数据?
解决方法
针对你定义的vec2d类型数组的输入问题,分三种场景给出实现方式:
1. 固定大小的数组
如果已经确定数组大小,可循环读取每个vec2d对象的两个分量,再赋值给数组元素:
#include <iostream> // 假设你的vec类定义在此处或已包含对应头文件 typedef vec<int, 2> vec2d; int main() { const int ARRAY_SIZE = 6; vec2d myvec2d[ARRAY_SIZE]; std::cout << "请输入" << ARRAY_SIZE << "组整数(每组2个):" << std::endl; for (int i = 0; i < ARRAY_SIZE; ++i) { int x, y; std::cin >> x >> y; // 方式1:用初始化列表构造vec2d对象赋值 myvec2d[i] = vec2d{x, y}; // 方式2:如果vec支持下标访问,直接设置分量 // myvec2d[i][0] = x; // myvec2d[i][1] = y; } return 0; }
2. 动态大小的数组(推荐用vector)
如果不确定元素个数,建议用std::vector<vec2d>存储,灵活添加元素,解决你之前push_back失败的问题:
#include <iostream> #include <vector> typedef vec<int, 2> vec2d; int main() { std::vector<vec2d> myvecs; int count; std::cout << "请输入元素个数:"; std::cin >> count; std::cout << "请输入" << count << "组整数(每组2个):" << std::endl; for (int i = 0; i < count; ++i) { int x, y; std::cin >> x >> y; // 构造临时vec2d对象并添加到vector中 myvecs.push_back(vec2d{x, y}); // 或者先创建对象赋值再添加 // vec2d temp; // temp[0] = x; // temp[1] = y; // myvecs.push_back(temp); } return 0; }
3. 重载输入运算符(更简洁的方式)
如果想直接用std::cin >> myvec2d[i]的形式读取,可为vec<T, N>模板类重载输入运算符:
#include <iostream> template <typename T, int N> class vec { // 你的vec类实现,假设包含下标运算符[] public: T& operator[](int idx) { /* 此处实现下标访问 */ } const T& operator[](int idx) const { /* 此处实现const下标访问 */ } }; // 重载输入运算符 template <typename T, int N> std::istream& operator>>(std::istream& is, vec<T, N>& v) { for (int i = 0; i < N; ++i) { is >> v[i]; } return is; } typedef vec<int, 2> vec2d; int main() { vec2d myvec2d[6]; std::cout << "请输入6组整数(每组2个):" << std::endl; for (int i = 0; i < 6; ++i) { // 直接读取整个vec2d对象 std::cin >> myvec2d[i]; } return 0; }
内容的提问来源于stack exchange,提问作者babakmazdaki
相关产品推荐
相关产品推荐

