任务4
vector.hpp
#pragma once
#include<iostream>
#include<stdexcept>
using std::cout;
using std::endl;
template <typename T>
class Vector{
public:
Vector(int s);
Vector(int s,T v);
Vector(const Vector<T> &v);
~Vector();
int get_size()const;
T& at(int index){
return static_cast<const Vector*>(this)->at(index);
}
T& at(int index)const;
T& operator[](int index)const;
T& operator[](int index){
return static_cast<const Vector*>(this)->operator[](index);
}
template <typename T1>
friend void output(const Vector<T1>&);
private:
int size;//数组大小
T *ptr;//数组类型
};
template <typename T>
Vector<T>::Vector(int s):size(s)
{
if(s<0)
{
throw std::length_error("vector constructor: negative size");
}
ptr = new T[size];
}
template <typename T>
Vector<T>::Vector(int s,T v):size(s)
{
if(s<0)
{
throw std::length_error("vector constructor: negative size");
}
ptr = new T[size];
for(int i=0;i<size;++i)
{
ptr[i] = v;
}
}
template <typename T>
Vector<T>::Vector( const Vector &v):size(v.size),ptr(new T[size])
{
if(v.size<0)
{
throw std::length_error("vector constructor: negative size");
}
for(int i=0;i<size;++i)
{
ptr[i] = v.ptr[i];
}
}
template <typename T>
Vector<T>::~Vector()
{
delete[] ptr;
}
template <typename T>
int Vector<T>::get_size()const{
return this->size;
}
template <typename T>
T& Vector<T>::at(int index)const{
if(index<0 || index >=size)
{
throw std::out_of_range("vector::at():index out of this->size");
}
return ptr[index];
}
template<typename T>
T& Vector<T>::operator[](int index)const
{
if(index<0 || index >=size)
{
throw std::out_of_range("vector::operator[]:index out of this->size");
}
return ptr[index];
}
template<typename T1>
void output(const Vector<T1>& v){
for (int i = 0; i < v.get_size(); ++i) {
std::cout << v.at(i);
if (i < v.get_size() - 1) {
std::cout << ",";
}
}
std::cout << std::endl;
}
task4.cpp
#include <iostream>
#include "Vector.hpp"
void test1() {
using namespace std;
int n;
cout << "Enter n: ";
cin >> n;
Vector<double> x1(n);
for(auto i = 0; i < n; ++i)
x1.at(i) = i * 0.7;
cout << "x1: "; output(x1);
Vector<int> x2(n, 42);
const Vector<int> x3(x2);
cout << "x2: "; output(x2);
cout << "x3: "; output(x3);
x2.at(0) = 77;
x2.at(1) = 777;
cout << "x2: "; output(x2);
cout << "x3: "; output(x3);
}
void test2() {
using namespace std;
// int n, index;
// while(cout << "Enter n and index: ", cin >> n >> index) {
// try {
// Vector<int> v(n, n);
// v.at(index) = -999;
// cout << "v: "; output(v);
// }
// catch (const exception &e) {
// cout << e.what() << endl;
// }
// }
test1();
}
int main() {
cout << "测试1: 模板类接口测试\n";
test1();
cout << "\n测试2: 模板类异常处理测试\n";
test2();
}
结果:
中间出现过的报错信息:
[Warning] friend declaration 'void output(const Vector
解决方案:这个警告信息表明,您在 Vector 类中将 output 函数声明为友元函数时,没有将其声明为模板函数。然而,从上下文来看,output 函数应该是一个模板函数,因为它需要能够处理不同类型的 Vector
template <typename T1>
friend void output(const Vector<T1>&);
任务5:
student.hpp
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
#include <algorithm>
#include <string>
using namespace std;
// 学生结构体
struct Student {
string id;
string name;
string major;
int score;
// 用于排序的比较函数(降序比较分数)
bool operator<(const Student& other) const {
if (major != other.major) {
return major < other.major; // 先按专业字典序排序
} else {
return score > other.score; // 专业相同则按分数降序排序
}
}
};
// 从文件中读取学生信息
vector<Student> readStudentsFromFile(const string& filename) {
vector<Student> students;
ifstream file(filename);
string line;
while (getline(file, line)) {
istringstream iss(line);
Student student;
iss >> student.id >> student.name >> student.major >> student.score;
students.push_back(student);
}
file.close();
return students;
}
// 将学生信息写入文件
void writeStudentsToFile(const vector<Student>& students, const string& filename) {
ofstream file(filename);
for (const auto& student : students) {
file << student.id << "\t" << student.name << "\t" << student.major << "\t" << student.score << "\n";
}
file.close();
}
task5.cpp
#include "student.hpp"
#include<iostream>
#include<fstream>
int main() {
vector<Student> students = readStudentsFromFile("data5.txt");
// 使用STL的sort函数进行排序,这里需要提供一个比较函数或操作符重载
sort(students.begin(), students.end());
// 打印到屏幕
for (const auto& student : students) {
cout << student.id << "\t" << student.name << "\t" << student.major << "\t" << student.score << "\n";
}
// 保存到文件
writeStudentsToFile(students, "ans5.txt");
return 0;
}
结果:
结束后的文件目录