使用对向量的向量
Working with a vector of pair vectors?
我一直在谷歌上搜索,但我没有找到我需要的东西。我正在尝试创建一个允许我添加 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));`
正如这里所建议的,我认为您应该分别使用 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 需要执行以下操作:
- 对
tuple
s 进行 2 个常量引用 - 如果第一个
tuple
严格小于第二个tuple
则返回true
- 如果第一个
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
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在C++中调整向量中的索引
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么