如何根据结构体的字段之一对结构指针列表进行排序?
How can I sort a list of struct pointers according to one of the struct's fields?
我有这样的代码:
struct nod
{
nod *vCap;
int vCost;
char vInfo;
};
list<nod*> vList;
for (int i = 9; i >= 0; i--)
{
nod *vTmp;
vTmp->vCost=i;
vTmp->vInfo='a';
vList.push_back(vTmp);
}
如何按vCost
值对列表进行排序?
您需要一个自定义比较器来比较您感兴趣的字段:
struct compare_nod_by_cost {
bool operator()(nod const * a, nod const * b) {
return a->vCost < b->vCost;
}
};
那么您可以提供它作为list::sort
的比较器:
vList.sort(compare_nod_by_cost());
在c++ 11中,您可以将其压缩为lambda:
vList.sort([](nod const * a, nod const * b) {return a->vCost < b->vCost;});
(请注意,您几乎肯定希望在列表中存储对象,而不是指针;在这种情况下,将比较器的指针参数更改为引用)。
使用lambda:
vList.sort([](const nod * a, const nod * b ) { return a->vCost < b->vCost; });
如果nod
的正常或自然排序是按成本排序的,那么您可能需要定义它的operator<
来这样做:
struct nod{
nod*vCap;
int vCost;
char vInfo;
bool operator<(nod const &other) { return vCost < other.vCost; }
};
那么,当然,您几乎肯定想要创建list<nod>
而不是list<nod*>
。完成后,在列表中排序项将仅为vList.sort();
。
顺便说一句,您还需要修复nod
定义中的一个错别字(在vCost
和vInfo
的定义之间使用逗号而不是分号)。
相关文章:
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 如何在构建链接列表时调整头、尾指针
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 处理从列表中删除指向对象的指针的"healthy"方法是什么?
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 如果函数采用指向类的指针,则函数将完全脱离候选列表
- 如何将共享指针列表传递到pybind11中的c++对象
- Unique_ptr:在列表中放置时未分配释放的指针
- C++:如何初始化包含具有给定键的指针列表的映射
- 使用继承的指针列表复制构造函数或重载运算符=
- 什么是结构开头的函数列表指针,称为 c++
- 使用 c++ 的 STL 列表 ..在传递列表指针的数组中
- 静止图像::获取设备列表指针
- 列表指针类的输出向量
- 使用PThreads访问全局列表-指针问题
- 操作迭代器列表+指针
- 在c++中分配带有列表指针值的STD映射
- python链接列表指针和大小
- 如何调整STL列表指针的大小