根据元素之一的值对结构进行分组

时间:2020-10-19 10:39:11

标签: c++

我的结构定义如下:

typedef struct
{
    char node_id[NODE_NAME_LEN];
    char point_id[POINT_TYPE_LEN];
    int32_t io_rate;
}node_point_info_type; 

将填充此结构并将其作为函数的输入[其结构数组-且该数组的范围可能在60k左右],它将标签分组,我应该仅使用C ++编写此分组逻辑代码在C语言中。

在分组逻辑中,我必须基于io_rate进行分组,即类似的io_rate值必须分组为一个。 对于这种方法,我实现了以下代码。

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <string.h>

#define NODE_NAME_LEN       (64)
#define POINT_TYPE_LEN      (64)

using namespace std;

typedef struct
{
    char node_id[NODE_NAME_LEN];
    char point_id[POINT_TYPE_LEN];
    int32_t io_rate;
}node_point_info_type;

// Sort Container by node_id
bool sort_by_node_id(const node_point_info_type &lhs, const node_point_info_type &rhs)
{ 
    return lhs.node_id < rhs.node_id; 
}

// Sort Container by io_rate
bool sort_by_io_rate(const node_point_info_type &lhs, const node_point_info_type &rhs) 
{ 
    return lhs.io_rate < rhs.io_rate;
}

// Sort Container by point_id
bool sort_by_point_id(const node_point_info_type &lhs, const node_point_info_type &rhs) 
{ 
    return lhs.point_id < rhs.point_id; 
}


void group_tags(node_point_info_type *info, int num_of_nodes)
{
    vector <node_point_info_type> node_info;
    // Copy data to a vector
    for (int i = 0; i < num_of_nodes; i++)
    {
        node_info.push_back(info[i]);
    }
    // Sort by node_id
    sort(node_info.begin(), node_info.end(), sort_by_node_id);
    for (node_point_info_type &n : node_info)
        cout << n.node_id << " ";
    cout << endl;

    // Sory by io_rate
    sort(node_info.begin(), node_info.end(), sort_by_io_rate);
    for (node_point_info_type &n : node_info)
        cout << n.io_rate << " ";

    cout << endl;
    // Sort by point_id
    sort(node_info.begin(), node_info.end(), sort_by_point_id);
    for (node_point_info_type &n : node_info)
        cout << n.point_id << " ";

}

int main()
{
    const unsigned numberOfnode_info = 6;

    node_point_info_type node_info[numberOfnode_info];

    strcpy(node_info[0].node_id, "BOOL_TAG_00001");
    node_info[0].io_rate = 100;
    strcpy(node_info[0].point_id, "010100000000000000");

    strcpy(node_info[1].node_id, "REAL_TAG_00002");
    node_info[1].io_rate = 200;
    strcpy(node_info[1].point_id, "010100000000000005");

    strcpy(node_info[2].node_id, "DOUBLE_TAG_00001");
    node_info[2].io_rate = 150;
    strcpy(node_info[2].point_id, "010100000000000002");

    strcpy(node_info[3].node_id, "REAL_TAG_00001");
    node_info[3].io_rate = 200;
    strcpy(node_info[3].point_id, "010100000000000004");

    strcpy(node_info[4].node_id, "BOOL_TAG_00002");
    node_info[4].io_rate = 150;
    strcpy(node_info[4].point_id, "010100000000000001");

    strcpy(node_info[5].node_id, "REAL_TAG_00002");
    node_info[5].io_rate = 100;
    strcpy(node_info[5].point_id, "010100000000000005");
    
    group_tags(node_info, numberOfnode_info);
    return 0;
}

在此代码中,我已将结构值复制到向量中并对其进行了排序[对于示例代码,我仅具有6个node_point_info_type的硬编码数组,该结构数组的范围可以一直到64K,即numberOfnode_info = 640000,我从csv文件并填充node_point_info_type结构]。

我想将结构与io_rate相同,即我想将io_rate = 200的node_info结构值作为一个组进行分组,对于100和150类似。在上面,我想为100创建3个组,分别为150和200,并且此io_rate可以变化。

我能获得关于如何使用C ++实现此目标的任何输入/算法吗,我是C ++的新手。

0 个答案:

没有答案