编写应用程序: 我需要在哪里维护一个数据结构'X-Files',它存储了许多对象并支持以下功能:
支持这些要求的最合适的数据结构是什么?
答案 0 :(得分:4)
std::set
应该可以胜任。
虽然您的问题可能类似于使用<div>
,但不要陷入陷阱,因为香草std::priority_queue
不支持更新现有元素(除了头部),也不检查是否有效地存在一个元素。
答案 1 :(得分:2)
如果优先级和密钥是不同的属性,则可以使用双索引multi_index_container
。快速而肮脏的例子如下:
<强> Live Coliru Demo 强>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
using namespace boost::multi_index;
struct element
{
int key;
int area51;
};
using x_files_base=multi_index_container<
element,
indexed_by<
ordered_non_unique<member<element,int,&element::area51>>,
hashed_unique<member<element,int,&element::key>>
>
>;
class x_files:x_files_base
{
public:
using x_files_base::iterator;
using x_files_base::const_iterator;
using x_files_base::x_files_base;
using x_files_base::begin;
using x_files_base::end;
void pop(){erase(begin());}
bool push(const element& x){return insert(x).second;}
bool check(int key){return project<0>(get<1>().find(key))!=end();}
void update(int key,int area51)
{
auto it=project<0>(get<1>().find(key));
if(it!=end())modify(it,[=](element& x){x.area51=area51;});
}
};
#include <iostream>
#include <string>
void dump(const x_files& xf)
{
std::string delim="";
for(const element& x:xf){
std::cout<<delim<<"["<<x.key<<","<<x.area51<<"]";
delim=",";
}
std::cout<<"\n";
}
int main()
{
x_files xf={{100,0},{80,1},{90,2},{95,3}};
dump(xf);
xf.pop();
dump(xf);
xf.push({70,4});
dump(xf);
std::cout<<(xf.check(70)?"true":"false")<<"\n";
xf.update(70,0);
dump(xf);
}
输出
[100,0],[80,1],[90,2],[95,3] [80,1],[90,2],[95,3] [80,1],[90,2],[95,3],[70,4] true [70,0],[80,1],[90,2],[95,3]