支持优先级,更新,推送和弹出的最佳数据结构是什么?

时间:2016-02-23 17:24:10

标签: c++ algorithm c++11 data-structures

编写应用程序: 我需要在哪里维护一个数据结构'X-Files',它存储了许多对象并支持以下功能:

  1. Pop - 删除值最小的对象(名为“Area51”的对象属性之一)
  2. 推送 - 将对象插入数据结构
  3. 检查 - 给定对象是否在数据结构“X-Files”
  4. 更新 - 更新对象的内容(涉及更新属性'Area51',并保证更新将严格限制为低于当前值)
  5. 支持这些要求的最合适的数据结构是什么?

2 个答案:

答案 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]