首页 > 编程语言 >C++函数返回多种数据类型

C++函数返回多种数据类型

时间:2024-11-10 12:15:04浏览次数:3  
标签:std 函数 int 数据类型 C++ students vector result Result

返回复合数据的结构体

定义一个结构体 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() 成员函数,它用于访问容器中指定位置的元素。

标签:std,函数,int,数据类型,C++,students,vector,result,Result
From: https://blog.csdn.net/gsgbgxp/article/details/143651046

相关文章

  • 【C++】踏上C++的学习之旅(六):深入“类和对象“世界,掌握编程的黄金法则(一)
    文章目录前言1."面向过程"和"面向对象"的碰撞1.1面向过程1.2面向对象2."类"的引入3."类"的定义3.1......
  • 《 C++ 修炼全景指南:十九 》想懂数据库?深入 B 树的世界,揭示高效存储背后的逻辑
    摘要本文深入探讨了B树的原理、操作、性能优化及其实际应用。B树作为一种平衡多路树结构,因其高效的查找、插入和删除操作广泛应用于数据库与文件系统中。文章首先介绍了B树的定义与性质,并详细阐述了节点分裂、合并等核心操作的实现方法。接着,通过分析B树在数据库检......
  • 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS
    因为C++具有跨平台的特性,所以有些需求一套代码就多端使用,比如我最近在学习的OpenGLES。但是,不同平台还是具有一定差异性,所以我们首先得判断出是什么平台?比如iOS系统和Android系统。那么如何判断呢?我们接着往下看!要检查C或C代码中主机的操作系统,我们需要检查编......
  • C++基础学习4练习
    //题目三:交换两个变量的值//定义两个整数变量,要求用户输入它们的值。//交换这两个变量的值,并输出交换后的结果。//#define_CRT_SECURE_NO_WARNINGS1//#include<stdio.h>//intmain()//{// inta=0;// intb=0;// intc=0;// intd=0;//// printf("请输入数......
  • spdlog一个非常好用的C++日志库(十): 十六进制输出spdlog::to_hex
    目录1.引言2.spdlog::to_hex用法3.spdlog::to_hex实现原理4.总结1.引言    在平时调试网络程序时,多数都会用到wireshark抓包工具,在查看某个包的数据都是按照下面这样格式显示的:那么它是怎么做到的呢?其实spdlog的to_hex也能做到这一点,下面就来介绍它的用法和原......
  • C++之模板
    C++模板是一种支持泛型编程的机制,允许开发者定义使用任意类型作为参数的函数和类。模板提供了代码复用和类型安全的抽象,使得同一段代码可以用于不同的数据类型。函数模板定义和使用函数模板是一种可以接受任意类型参数的函数。它通过在函数声明中使用模板参数(用尖括号<>包围......
  • C++之vector 容器的使用
    在C++中,std::vector是一个非常灵活且常用的容器,它提供了动态数组的功能。以下是一些基本的使用方式:包含头文件要使用std::vector,首先需要包含头文件<vector>。#include<vector>创建vector//创建一个空的vectorstd::vector<int>vec;//创建一个vector并初始化......
  • C++之智能指针
    智能指针是C++中的一种资源管理工具,用于自动管理动态分配的内存。它们通过在不再需要时自动释放内存来防止内存泄漏。C++标准库提供了几种不同类型的智能指针,每种都有其特定的用途和行为。主要的智能指针类型std::unique_ptrstd::shared_ptrstd::weak_ptr1. std::unique_pt......
  • Open3D (C++) 旋转矩阵转欧拉角公式推导及过程实现
    目录一、概述1.1原理1.2实现步骤1.3应用场景1.4注意事项二、关键函数2.1头文件2.2主要函数三、完整代码三、结果展示一、概述  将旋转矩阵转换为欧拉角是逆向理解三维对象姿态的一种方法。旋转矩阵是一个3x3的正交矩阵,它描述了在三维空......
  • C++-练习-67
    题目:考虑下面的结构声明structcustomer{        charfullname[35];        doublepayment;};编写一个程序,它从栈中添加和删除customer结构(栈用Stack类声明)。每次customer结构被删除时,其payment的值都被添加到总数中,并报告总数。源代码:test.h#if......