2015-12-23 3 views
-1
Ticket* Championship::findTicketByFanID(unsigned int id) { 

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

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

} 

Здравствуйтеполучить значение из хеш-таблицы

я хотел бы вернуть объект, который находится на итератора его. билеты является хэш-таблицей, в которой хранятся объекты типа Ticket. Когда я это ищу, есть какое-то решение для возврата этого объекта?

Я хочу быть в состоянии сделать это, так что я могу сделать 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; 

С уважением

+1

'вернуть IT-> второй,' – ChronoTrigger

+0

И не все пути управления покрыты. Пожалуйста, покажите точный тип 'hTabTickets'. – LogicStuff

+0

хэш-таблица добавлена. – Perseverance

ответ

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; 
} 

Если вы ищете для идентификатора очень часто, вы можете изменить это значение set для map.

+0

неверное преобразование из 'const Ticket *' в 'Ticket *' [-fpermissive] – Perseverance

+0

Если 'ticket' или' findTicketByFanID' 'const, вы не можете (или не должны) возвращать указатель не const. Измените возвращаемый тип функции на 'const Ticket *'. – ChronoTrigger

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; 
    } 
};  
0

Я хочу быть в состоянии сделать это, так что я могу сделать t1 Ticket = 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> и использовать идентификатор в качестве ключа. Тогда эта функция будет:

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; 
} 
0
hTabTickets::iterator it = tickets.begin() 

«это» тип переменного ни билеты, ни билет *, это пара, которая содержит ключ и значение переменного, вы используете это неправильно, вероятно, вам нужно написать:

it->second  

, чтобы получить доступ к билету самому

Смежные вопросы