从哈希表中获取值

时间:2015-12-23 18:42:02

标签: c++ hashtable

Ticket* Championship::findTicketByFanID(unsigned int id) {

    hTabTickets::iterator it = tickets.begin();

    while(it != tickets.end()) {
        if(it->getOwnerID() == id)
            return it;
    }

}

你好

我想返回迭代器上的对象。 故障单是一个哈希表,用于保存故障单类型的对象。当我搜索它时,有任何解决方案可以返回该对象吗?

我希望能够这样做,所以我可以Ticket t1 = findTicketByFan(id);

hTabTickets:

struct eqTicket {
    bool operator() (const Ticket &b1, const Ticket &b2) const{
        return b1.getID() == b2.getID();
    }
};

struct hTicket{
    int operator() (const Ticket &b1) const{
        return b1.getID();
    }


};

typedef tr1::unordered_set<Bilhete, hTicket, eqTicket> hTabTickets;

此致

4 个答案:

答案 0 :(得分:0)

也许你想要这个:

Ticket* Championship::findTicketByFanID(unsigned int id) {
  for (hTabTickets::iterator it = tickets.begin(); it != tickets.end(); ++it) {
      if(it->getOwnerID() == id)
          return &(*it);
  }
  return NULL;
}

如果您经常搜索ID,则可能需要更改set的{​​{1}}。

答案 1 :(得分:0)

参考文献在这里有很大用处。通常返回本地指针不是一个好主意。以下给出了一个案例。您的代码有两个问题:(a)并非所有路径都返回值,(b)哈希表应该快速定位(理想情况下为O(1)),因此循环是一个坏主意。此外,it没有在循环中递增。

class Campeonato {
    // Using STL hashmap
    map<unsigned int, int> tickets;

    public:       
    // the return value tells you whether to use iterator or not.
    bool findTicketByFanID(unsigned int id, map<unsigned int, int>::iterator &it) {
        // std::map provides method find
        it = tickets.find(id);
        if (it != tickets.end())
            return true;

        return false;
    }
};    

答案 2 :(得分:0)

  

我希望能够这样做,所以我可以做Ticket t1 = findTicketByFan(id);

如果是你的意图,返回类型不正确,它应该通过值或(const)引用返回,而不是指针。另一个问题是,您使用std::unordered::set并尝试搜索循环,但您应该使用std::unordered_set::find()代替:

Ticket Championship::findTicketByFanID(unsigned int id) 
{
    hTabTickets::iterator it = tickets.find( Ticket( id ) );
    if( it == tickets.end() ) // not found do something
        throw std::runtime_error( "Ticket not found" );
    return *it;
}

如果创建临时票证太贵,则应使用std::unordered_map<int,Ticket>代替并使用id作为键。然后这个函数将是:

Ticket Championship::findTicketByFanID(unsigned int id) 
{
    hTabTickets::iterator it = tickets.find( id );
    if( it == tickets.end() ) // not found do something
        throw std::runtime_error( "Ticket not found" );
    return it->second;
}

答案 3 :(得分:0)

hTabTickets::iterator it = tickets.begin()

'it'变量的类型既不是Ticket,也不是Ticket *,它是包含键和值变量的对,你使用它错了,可能你需要写:

it->second    

访问Ticket本身