C++ 使用一对向量的向量?

C++ 使用一对向量的向量?,c++,c++11,vector,stl,C++,C++11,Vector,Stl,我一直在谷歌搜索,但没有找到我需要的东西。我试图创建一个向量,允许我添加3个变量(在我需要存储4个变量之后),访问并排序它们 我对3个变量实现了如下向量: std::vector<std::pair<std::string, std::pair<int, double> > > chromosomes; 如何访问每个参数并根据WSA和故障覆盖率对其进行排序?在向量对中,我可以使用成员first和second来实现这一点 对于4个变量,它如下所示 std::v

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

我对3个变量实现了如下向量:

std::vector<std::pair<std::string, std::pair<int, double> > > chromosomes;
如何访问每个参数并根据WSA和故障覆盖率对其进行排序?在向量对中,我可以使用成员
first
second
来实现这一点

对于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));`
std::vector>染色体;
染色体。定位回(std::make_pair(dirp->d_name,x),std::make_pair(WSA,fault_percent))`

看起来您需要一个类似于表的数据结构,它允许按多列排序。C++不是最简单的操作表/矩阵数据结构的语言,但这里有几个帮助您入门的链接。p> 一个示例表类:

向量/元组解决方案,它是您当前工作的稍微干净的版本:

关于这个问题的长时间讨论,可能会给你一些额外的想法:

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

向量/元组解决方案,它是您当前工作的稍微干净的版本:

关于这个问题的长时间讨论,可能会给你一些额外的想法:
首先要访问不同的元素:

for (auto& x :chromosomes) 
    cout <<x.first<<": "<<x.second.first<<" "<<x.second.second<<endl; 
通过这种方式,它将更具可读性和可维护性:

sort(chromosomes.begin(), chromosomes.end(),
            [](auto &x, auto &y) { return x.WSA<y.WSA 
                          || (x.WSA==y.WSA && x.fault_percent<y.fault_percent );});
     
排序(染色体.begin(),染色体.end(),
[](auto&x,auto&y){return x.WSA首先访问不同的元素:

for (auto& x :chromosomes) 
    cout <<x.first<<": "<<x.second.first<<" "<<x.second.second<<endl; 
通过这种方式,它将更具可读性和可维护性:

sort(chromosomes.begin(), chromosomes.end(),
            [](auto &x, auto &y) { return x.WSA<y.WSA 
                          || (x.WSA==y.WSA && x.fault_percent<y.fault_percent );});
     
排序(染色体.begin(),染色体.end(),
[](auto&x,auto&y){return x.WSA正如这里建议的那样,我认为应该分别使用s的
向量
元组
s

定义了一个从左向右移动的组合类型使用小于运算符。如果对每个元素进行简单比较就足够了,则只需调用
排序

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

如果这里建议的
tuple::operator,我认为应该分别使用s或
tuple
s的
向量

定义了一个从左向右移动的组合类型使用小于运算符。如果对每个元素进行简单比较就足够了,则只需调用
排序

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


如果使用
元组::运算符,则使用或仅使用
结构可能更容易,并且您可以根据需要命名成员。
std::vector>
不应编译(而不仅仅是因为额外的
).您使用对是因为这是表示信息之间关系的逻辑正确方法吗?还是您使用对作为将事物粘合在一起的快速方法,不管它是否合理?@NathanOliver不是固定大小的元组?我使用向量是因为我需要动态大小。也许结构可以是我需要的。谢谢you@LeonardoAlves元组有固定数量的元素,但可以有一个元组向量。使用一个或只使用一个
结构可能更容易,并且您可以随意命名成员。
std::vector>
不应该编译(不仅仅是因为额外的
).您使用对是因为这是表示信息之间关系的逻辑正确方法吗?还是您使用对作为将事物粘合在一起的快速方法,不管它是否合理?@NathanOliver不是固定大小的元组?我使用向量是因为我需要动态大小。也许结构可以是我需要的。谢谢you@LeonardoAlves一个元组有固定数量的元素,但你可以有一个元组向量。我的问题是,关于计算机处理时间,元组不是“太贵”吗?@LeonardoAlves:绝对不是;就像
pair
,它被设计成尽可能接近免费,并且非常成功。我的问题是,关于计算机处理时间,tupple不是“太贵”吗?@LeonardoAlves:绝对不是;很像
pair
,它被设计成尽可能接近免费,并且非常成功。这就是我所想的,struct处理时间也更少(我想)。非常感谢您,以及所有给我提供了很多好解决方案的人。首先,
pair
tuple
内置了词典比较,因此排序示例实际上是
sort(cs.begin(),cs.end(),[](auto&x,auto&y){return x.second
。其次,您确实找到了
sort(cs.begin()),cs.end(),[](auto&x,auto&y){return x.WSA
比排序(cs.begin(),cs.end(),[](auto&x,auto&y){return tie(x.WSA,x.fault_center)
?o_o我当然不会!而且,令人惊讶的是,后者是以
元组的形式实现的;-]我进一步认为,任何UDT在不使用
std::tie
的情况下,以其成员的形式实现词典编纂比较,都是糟糕的代码,因为您所展示的方法无法很好地扩展f涉及的成员增加。@ildjarn感谢您分享元组。我并不反对他们,您关于tie和字典排序的评论当然是正确的。我的观点是,仅在元组上构造复杂的数据结构是不合理的。您的最后一个示例是可读的,因为您可以使用干净结构的成员名称引用一个有序的未命名元组成员。如果以后需要额外的信息,顺便说一句wsa和百分比,只有元组OP会
sort(chromosomes.begin(), chromosomes.end());
sort(chromosomes.begin(), chromosomes.end(), [](const auto& lhs, const auto& rhs) {
    // Your comparison between the two goes here
});