使用双向量向量?

时间:2016-01-25 21:01:39

标签: c++ c++11 vector stl

我一直在谷歌搜索,但我找不到我需要的东西。我正在尝试创建一个向量,允许我添加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));`

3 个答案:

答案 0 :(得分:3)

根据此处的建议,我认为您应该分别使用vectortuple<string, int, double>tuple<string, string, int, double>

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

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

如果tuple::operatior<没有为您的需求提供足够的比较sort提供了一个带有比较lambda的重载。你的lambda需要做以下事情:

  1. 接受对tuple s
  2. 的2个const引用
  3. 如果第一个true严格小于第二个tuple
  4. ,请返回tuple
  5. 如果第一个false大于或等于第二个tuple
  6. ,请返回tuple

    最后你的电话会是这样的:

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

    如果您不熟悉使用tuple s,那么您需要使用模板get方法,在没有索引或类型的情况下提取tuple包含的重复类型。

答案 1 :(得分:2)

首先访问不同的元素:

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

接下来, sort 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 );});

这是online demo

备注

现在让我感到困惑的是,当你可以使用一个更容易存储/检索并访问其成员的干净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 );});

答案 2 :(得分:1)

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

示例Table类: How to dynamically sort data by arbitrary column(s)

矢量/元组解决方案,它是您目前正在处理的稍微清晰的版本: sorting table in place using stl sort

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