返回复合数据的结构体
定义一个结构体 Result,它包含一个整数、一个数组(使用 std::vector)和一个矩阵(使用 std::vector<std::vector>)。然后实现一个函数来填充这些数据并返回。
示例代码:
#include <iostream>
#include <vector>
#include <string>
struct Result {
int number; // 单个数字
std::vector<int> array; // 动态数组
std::vector<std::vector<int>> matrix; // 矩阵
};
// 函数返回一个 Result 结构体
Result getData(int size, int rows, int cols) {
Result result;
// 设置结果中的数字
result.number = 42;
// 填充数组
result.array.resize(size);
for (int i = 0; i < size; ++i) {
result.array[i] = i + 1; // 数组内容为 1, 2, 3, ...
}
// 填充矩阵
result.matrix.resize(rows, std::vector<int>(cols));
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
result.matrix[i][j] = (i + 1) * (j + 1); // 矩阵内容为行列乘积
}
}
return result; // 返回结果
}
// 函数:输出结果
void printResult(const Result& result) {
std::cout << "Number: " << result.number << std::endl;
std::cout << "Array: ";
for (const auto& val : result.array) {
std::cout << val << " ";
}
std::cout << std::endl;
std::cout << "Matrix: " << std::endl;
for (const auto& row : result.matrix) {
for (const auto& val : row) {
std::cout << val << " ";
}
std::cout << std::endl;
}
}
int main() {
// 获取数据
Result result = getData(5, 3, 4); // 数组大小为 5,矩阵为 3x4
// 打印结果
printResult(result);
return 0;
}
输出结果为
Number: 42
Array: 1 2 3 4 5
Matrix:
1 2 3 4
2 4 6 8
3 6 9 12
返回单一类型的容器
有的时候返回的是一个“堆叠”起来的结构体,比如随着仿真的进行,每个时刻返回一个结构体,最后得到的是用vector
把这些结构体装起来的容器。
示例代码
#include <iostream>
#include <vector>
#include <string>
// 定义学生结构体
struct Student {
std::string name; // 学生姓名
int score; // 学生成绩
};
// 函数:添加学生到 vector
void addStudent(std::vector<Student>& students, const std::string& name, int score) {
Student newStudent; // 创建新学生
newStudent.name = name; // 设置姓名
newStudent.score = score; // 设置分数
students.push_back(newStudent); // 添加到 vector 中
}
// 函数:输出所有学生信息
void printStudents(const std::vector<Student>& students) {
std::cout << "学生信息:" << std::endl;
for (const auto& student : students) {
std::cout << "姓名: " << student.name << ", 分数: " << student.score << std::endl;
}
}
// 函数:返回多个学生信息的 vector
std::vector<Student> createStudentList() {
std::vector<Student> students; // 创建学生 vector
// 添加一些学生信息
students.push_back({ "Alice", 90 });
students.push_back({ "Bob", 85 });
students.push_back({ "Charlie", 92 });
return students; // 返回学生信息的 vector
}
int main() {
// 创建学生 vector
std::vector<Student> students;
// 添加学生信息
addStudent(students, "Alice", 90);
addStudent(students, "Bob", 85);
addStudent(students, "Charlie", 92);
// 输出学生信息
printStudents(students);
// 获取学生列表
std::vector<Student> students2 = createStudentList();
// 输出学生信息
printStudents(students2);
return 0;
}
输出结果为
学生信息:
姓名: Alice, 分数: 90
姓名: Bob, 分数: 85
姓名: Charlie, 分数: 92
学生信息:
姓名: Alice, 分数: 90
姓名: Bob, 分数: 85
姓名: Charlie, 分数: 92
用第二种形式重写第一个代码
改写后的代码为
#include <iostream>
#include <vector>
#include <string>
struct Result {
int number; // 单个数字
std::vector<int> array; // 动态数组
std::vector<std::vector<int>> matrix; // 矩阵
};
// 函数返回一个 Result 结构体
std::vector<Result> getData(int size, int rows, int cols) {
std::vector<Result> result(1);
// 设置结果中的数字
result.at(0).number = 42;
// 填充数组
result.at(0).array.resize(size);
for (int i = 0; i < size; ++i) {
result.at(0).array[i] = i + 1; // 数组内容为 1, 2, 3, ...
}
// 填充矩阵
result.at(0).matrix.resize(rows, std::vector<int>(cols));
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
result.at(0).matrix[i][j] = (i + 1) * (j + 1); // 矩阵内容为行列乘积
}
}
return result; // 返回结果
}
// 函数:输出结果
void printResult(const Result& result) {
std::cout << "Number: " << result.number << std::endl;
std::cout << "Array: ";
for (const auto& val : result.array) {
std::cout << val << " ";
}
std::cout << std::endl;
std::cout << "Matrix: " << std::endl;
for (const auto& row : result.matrix) {
for (const auto& val : row) {
std::cout << val << " ";
}
std::cout << std::endl;
}
}
int main() {
// 获取数据
std::vector<Result> results = getData(5, 3, 4); // 数组大小为 5,矩阵为 3x4
// 打印结果
//printResult(result);
for (const auto& result : results) {
printResult(result);
}
return 0;
}
这里需要注意的就是,这里函数返回的是一个包含多个结构体的vector(当然本例中只有一个)而不是一个单纯的结构体。
所以这里用到了 std::vector
提供的 at()
成员函数,它用于访问容器中指定位置的元素。