我一直在谷歌搜索,但我找不到我需要的东西。我正在尝试创建一个向量,允许我添加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和故障覆盖率对它们进行排序?正如在矢量对中,我可以使用成员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));`
答案 0 :(得分:3)
根据此处的建议,我认为您应该分别使用vector
个tuple<string, int, double>
或tuple<string, string, int, double>
。
有一个定义的tuple::operator<
,它使用小于运算符的每个组合类型从左向右移动。如果对每个元素进行简单比较就足够了,那么您需要做的就是调用sort
:
sort(chromosomes.begin(), chromosomes.end());
如果tuple::operatior<
没有为您的需求提供足够的比较sort
提供了一个带有比较lambda的重载。你的lambda需要做以下事情:
tuple
s true
严格小于第二个tuple
tuple
false
大于或等于第二个tuple
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 );});
现在让我感到困惑的是,当你可以使用一个更容易存储/检索并访问其成员的干净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