C++之结构体数组和std::vector容器结合使用的排序/均值/方差

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: C++之结构体数组和std::vector容器结合使用的排序/均值/方差

1、排序


最近有个项目需要使用C++ STL的vector容器,然后做一个排序操作。STL很强大,有它自己的排序方法。


std::sort(数组起始指针,数组尾指针,排序规则);


举例如下:

//参考文献,sort对结构体排序
//排序方法,sort(数组起始指针,数组尾指针,排序规则);
//数组起始指针,数组尾指针是左闭右开;
//排序规则可以省略,也可以自己写;
//https://blog.csdn.net/qq_40828914/article/details/80670151
#include <QCoreApplication>
#include <algorithm>
#include <iostream>
#include <string>
//结构体排序方法1
//按姓名从小到大排序,姓名一样,按年龄从小到大排序
struct student1
{
    std::string name; //姓名
    int age;          //年龄
};
bool compare(const student1 &s1, const student1 &s2)
{
    //自己定义的排序规则
    if (s1.name == s2.name)
    {
        return s1.age < s2.age;
    }
    else
    {
        return s1.name < s2.name;
    }
}
//结构体排序方法2
//按姓名从小到大排序,姓名一样,按年龄从小到大排序
struct student2
{
    std::string name; //姓名
    int age;          //年龄
    bool operator<(const student2 &s2) const
    {
        //符号重载
        if (name == s2.name)
        {
            return age < s2.age;
        }
        else
        {
            return name < s2.name;
        }
    }
};
int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    //普通数组排序
    int a[] = {9, 2, 4, 5, 10, 7, 30};
    std::sort(a, a + 7);                   //省略掉排序规则的形式,默认从小到大
    std::sort(a, a + 7, std::less<int>()); //用c++自身的排序规则,从小到大
    for (int i = 0; i < 7; i++)
    {
        std::cout << a[i] << " ";
    }
    std::cout << std::endl;
    std::sort(a, a + 7, std::greater<int>()); //用c++自身的排序规则,从大到小
    for (int i = 0; i < 7; i++)
    {
        std::cout << a[i] << " ";
    }
    std::cout << std::endl;
    //结构体数组排序方法1
    student1 s1[100];
    s1[0].name = "zhangsan";
    s1[0].age = 18;
    s1[1].name = "zhangsan";
    s1[1].age = 19;
    s1[2].name = "lisi";
    s1[2].age = 20;
    std::sort(s1, s1 + 3, compare); //左闭右开,所以是对s[0]到s[2]排序
    for (int i = 0; i < 3; i++)
    {
        std::cout << s1[i].name << " " << s1[i].age << std::endl;
    }
    //结构体数组排序方法2:符合重载
    student2 s2[100];
    s2[0].name = "zhangsan";
    s2[0].age = 18;
    s2[1].name = "zhangsan";
    s2[1].age = 19;
    s2[2].name = "lisi";
    s2[2].age = 20;
    std::sort(s2, s2 + 3); //左闭右开,所以是对s[0]到s[2]排序
    for (int i = 0; i < 3; i++)
    {
        std::cout << s2[i].name << " " << s2[i].age << std::endl;
    }
    //针对std::vector容器排序
    std::vector<student1> vtDemo;
    student1 s3;
    s3.name = "hello";
    s3.age = 12;
    vtDemo.emplace_back(s3);
    s3.name = "world";
    s3.age = 7;
    vtDemo.emplace_back(s3);
    s3.name = "hello";
    s3.age = 11;
    vtDemo.emplace_back(s3);
    std::sort(vtDemo.begin(), vtDemo.end(), compare);
    for (size_t i = 0; i < vtDemo.size(); i++)
    {
        std::cout << vtDemo[i].name << " " << vtDemo[i].age << std::endl;
    }
    return app.exec();
}


2、均值与方差


先看基本数据结构

#include <numeric>
double sum = std::accumulate(std::begin(resultSet), std::end(resultSet), 0.0);  
double mean =  sum / resultSet.size(); //均值  
double accum  = 0.0;  
std::for_each (std::begin(resultSet), std::end(resultSet), [&](const double d) {  
    accum  += (d-mean)*(d-mean);  
});  
double stdev = sqrt(accum/(resultSet.size()-1)); //方差


再看自定义数据结构


struct Grade
{
    string name;
    int grade;
};
std::vector<Grade> subject = {
    {"English", 80},
    {"Biology", 70},
    {"History", 90}};
int test()
{
    //方法1,accumulate
    int sum1 = std::accumulate(subject.begin(), subject.end(), 0,
                               [](int a, Grade b) -> int {
                                   return a + b.grade;
                               });
    cout << "sum1 = " << sum1 << endl;
    //方法2,for_each
    int sum2 = 0;
    for_each(subject.begin(), subject.end(), [&sum2](Grade b) -> void {
        sum2 += b.grade;
    }); // sum2作为引用形参传递
    cout << "sum2 = " << sum2 << endl;
    system("pause");
    return 0;
}


相关文章
|
7月前
|
算法 编译器 C++
模拟实现c++中的vector模版
模拟实现c++中的vector模版
|
8月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
124 5
|
10月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
477 4
|
9月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
368 0
|
9月前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
202 0
|
2月前
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
189 57
|
2月前
|
存储 监控 Java
如何对迁移到Docker容器中的应用进行性能优化?
如何对迁移到Docker容器中的应用进行性能优化?
199 58
|
2月前
|
NoSQL Redis Docker
使用Docker Compose工具进行容器编排的教程
以上就是使用Docker Compose进行容器编排的基础操作。这能帮你更有效地在本地或者在服务器上部署和管理多容器应用。
258 11
|
2月前
|
缓存 Java Docker
如何对应用代码进行优化以提高在Docker容器中的性能?
如何对应用代码进行优化以提高在Docker容器中的性能?
177 1
|
30天前
|
安全 持续交付 Docker
Docker:重塑现代软件交付的容器引擎
Docker:重塑现代软件交付的容器引擎