gpt4 book ai didi

c++ - 从两个不同的字段中排序并确定唯一性的容器

转载 作者:太空宇宙 更新时间:2023-11-04 15:45:01 25 4
gpt4 key购买 nike

假设我已经定义了一个类型

struct Item
{
Item(int i, float j) : x(i), y(j) {}
int x;
float y;
};

我想将它们保存在一个容器中,使它们按 Item::y 排序,并确保每个条目都有一个唯一的 Item::x .我需要能够添加项目并删除顶部项目(即具有最小 y 值的项目)。

换句话说,可以做到这一点的东西:

Container<Item> my_container;
my_container.insert(Item(0, 3.2));
my_container.insert(Item(2, 1.1));
my_container.insert(Item(0, 0.2));
my_container.insert(Item(1, 0.6));
my_container.insert(Item(3, 0.6));
my_container.insert(Item(0, 6.1));

for (auto &i : my_container)
std::cout << i.x << " " << i.y << std::endl;

理想情况下,这会产生:

1 0.6
3 0.6
2 1.1
0 6.1

一开始我用的是std::set<Item>具有确保 item_1.y < item_2.y 的比较功能, 但这不允许在 item_1.y == item_2.y 时添加项目但是item_1.x != item_2.x .

有什么建议吗?谢谢。

更新

我决定研究 Boost Multi-Index,因为我有可用的 Boost。我几乎有一个解决方案(使用下面华金的回答):

#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index/member.hpp>

using namespace boost::multi_index;

struct Item
{
Item(int i, float j) : x(i), y(j) {}
int x;
float y;
};

typedef multi_index_container<
Item,
indexed_by<
ordered_non_unique<member<Item,float,&Item::y> >,
ordered_unique<member<Item,int,&Item::x> >
>
> my_container_t;

int main()
{
my_container_t mc;
mc.insert(Item(0, 3.2));
mc.insert(Item(2, 1.1));
mc.insert(Item(0, 0.2));
mc.insert(Item(1, 0.6));
mc.insert(Item(3, 0.6));
mc.insert(Item(0, 6.1));

const my_container_t::nth_index<0>::type& y_index = mc.get<0>();
// Print
for (auto &i : y_index)
std::cout << i.x << " " << i.y << std::endl;

return 0;
}

这个程序的输出是:

1 0.6
3 0.6
2 1.1
0 3.2

这几乎就是我想要的。请注意,插入 x = 0 的项目不会用该索引替换容器中的前一个项目。另外,顺便说一句,移除和返回容器中顶部项目的最佳方法是什么。这样的事情就足够了吗:

Item pop(my_container_t &mc)
{
my_container_t::nth_index<0>::type& container = mc.get<0>();
auto item = *container.begin();
container.erase(container.begin());
return item;
}

最佳答案

您需要两个容器:一个确保 x 的唯一性, 另一个提供订购 y然后x .

A boost multi_index容器可以同时完成这两项工作,但可能有点矫枉过正。

有一个setunordered_setx使用中的值,并丢弃已经存在的东西。

有一个sety 排序的元素然后x (std::tie(y,x)<std::tie(o.y,o.x) 是最简单和最安全的 C++11 方式),或者 multisety 订购,维持秩序。我更喜欢 set s 至 multiset是我自己,但这可能只是性格缺陷。

关于c++ - 从两个不同的字段中排序并确定唯一性的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17957444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com