使用对向量的向量

Working with a vector of pair vectors?

本文关键字:向量      更新时间:2023-10-16

我一直在谷歌上搜索,但我没有找到我需要的东西。我正在尝试创建一个允许我添加 3 个(之后我需要存储 4 个)变量的向量,访问和排序它们。

我正在为 3 个变量实现如下向量:

std::vector<std::pair<std::string, std::pair<int, double> > > chromosomes;

为了添加信息(变量),我正在做:

chromosomes.emplace_back(dirp->d_name, std::make_pair(WSA, fault_percent));

如何访问每个参数并根据 WSA 和故障覆盖率对它们进行排序?就像在对向量中一样,我可以使用成员 firstsecond 来做到这一点。

对于 4 个变量,它将如下所示?

std::vector<std::pair<std::string, std::string>, std::pair<int, double> > > chromosomes;
chromosomes.emplace_back( std::make_pair(dirp->d_name, x), std::make_pair(WSA, fault_percent));`

正如这里所建议的,我认为您应该分别使用 tuple<string, int, double> s 或 tuple<string, string, int, double> s 的vector

有一个定义的tuple::operator<,它对从左到右移动的每个组合类型使用小于运算符。如果每个元素的简单比较就足够了,那么您需要做的就是调用sort

sort(chromosomes.begin(), chromosomes.end());

如果tuple::operatior<不能提供足够的比较来满足您的需求,sort则会提供一个需要比较 lambda 的重载。您的 lambda 需要执行以下操作:

  1. tuple s 进行 2 个常量引用
  2. 如果第一个tuple严格小于第二个tuple则返回true
  3. 如果第一个tuple大于或等于第二个tuple则返回false

最后,您的呼叫将如下所示:

sort(chromosomes.begin(), chromosomes.end(), [](const auto& lhs, const auto& rhs) {
    // Your comparison between the two goes here
});

如果您不熟悉如何使用tuple,则需要使用模板化get方法在tuple不包含重复类型的情况下按索引或类型提取。

首先访问不同的元素:

for (auto& x :chromosomes) 
    cout <<x.first<<": "<<x.second.first<<" "<<x.second.second<<endl; 

接下来,对 WSA 上的元素进行排序

sort(chromosomes.begin(), chromosomes.end(),
             [](auto &x, auto &y) { return x.second.first<y.second.first;});

如果要按多个条件(例如 WSA 和 fault_percent)进行排序,只需更改 lambda 函数即可进行比较:

sort(chromosomes.begin(), chromosomes.end(),
            [](auto &x, auto &y) { return x.second.first<y.second.first 
                          || (x.second.first==y.second.first 
                                 && x.second.second<y.second.second );});

这是一个在线演示

备注

现在让我感到困惑的是,为什么要使用成对甚至元组,而您可以使用一个更容易存储/检索的干净struct,并访问其成员:

struct Chromosome {
    string name; 
    int WSA; 
    double fault_percent;  
};   
vector <Chromosome> chromosomes;  

这样会更具可读性和可维护性:

sort(chromosomes.begin(), chromosomes.end(),
            [](auto &x, auto &y) { return x.WSA<y.WSA 
                          || (x.WSA==y.WSA && x.fault_percent<y.fault_percent );});
     

似乎您需要一个类似表的数据结构,允许按多列排序。C++ 不是操作表/矩阵数据结构的最简单语言,但这里有一些链接可以帮助您入门。

示例表类:如何按任意列对数据进行动态排序

矢量/元组解决方案,它是您当前正在处理的内容的稍微干净的版本:使用 STL 排序就地对表进行排序

对这个问题的冗长讨论,可能会给你一些额外的想法:https://softwareengineering.stackexchange.com/questions/188130/what-is-the-best-way-to-store-a-table-in-c