aux::tokenizer::token tk = m_tok.current_token();
if (is_command(tk))
{
if (std::strncmp(tk.ptr, "#PAGE_PLOT", tk.len) == 0)
{
parse_page_plot_cmd();
}
else
if (std::strncmp(tk.ptr, "#WELL", tk.len) == 0)
{
parse_well_cmd();
}
else
if (std::strncmp(tk.ptr, "#PWDW", tk.len) == 0)
{
parse_pwdw_cmd();
}
else
if ()
// . . .
// и дальше штук двадцать
и я вот думаю менять его или нет:
может заменить эту конструкцию на std::map
или ещё какой вариант, который вы мне здесь, я надеюсь, подскажете.
а может оставить как есть, в надежде что компилятор сделает подобие map за меня?
Re: Чем заменить if () else if() else if() else if() else if
В самом деле, представляется неплохой идеей иметь map, в котором ключами являются строки, а значениями — указатели на функции.
Тогда вместо ифов получается очень элегантно:
the_map[tk.ptr]();
Не ГИС часом пишешь?
Да здравствует мыло душистое и веревка пушистая.
Re: Чем заменить if () else if() else if() else if() else if
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте,
K>имею такой код: K>
K> aux::tokenizer::token tk = m_tok.current_token();
K> if (is_command(tk))
K> {
K> if (std::strncmp(tk.ptr, "#PAGE_PLOT", tk.len) == 0)
K> {
K> parse_page_plot_cmd();
K> }
K> else
K> if (std::strncmp(tk.ptr, "#WELL", tk.len) == 0)
K> {
K> parse_well_cmd();
K> }
K> else
K> if (std::strncmp(tk.ptr, "#PWDW", tk.len) == 0)
K> {
K> parse_pwdw_cmd();
K> }
K> else
K> if ()
K> // . . .
K> // и дальше штук двадцать
K>
K>и я вот думаю менять его или нет: K>может заменить эту конструкцию на std::map K>или ещё какой вариант, который вы мне здесь, я надеюсь, подскажете. K>а может оставить как есть, в надежде что компилятор сделает подобие map за меня?
Здравствуйте, korzhik, Вы писали:
K>и я вот думаю менять его или нет: K>может заменить эту конструкцию на std::map K>или ещё какой вариант, который вы мне здесь, я надеюсь, подскажете. K>а может оставить как есть, в надежде что компилятор сделает подобие map за меня?
Почитай про паттерн state. Возможно, он тебе подойдет.
Re[2]: Чем заменить if () else if() else if() else if() else
Здравствуйте, Vamp, Вы писали:
V>В самом деле, представляется неплохой идеей иметь map, в котором ключами являются строки, а значениями — указатели на функции. V>Тогда вместо ифов получается очень элегантно:
V>
V>the_map[tk.ptr]();
V>
что элегантно это конечно хорошо, но карту(std::map) ещё заполнить надо:
получается конечно красивее, наверно так и переделаю, но меня больше в этом вопросе волнует скорость.
То есть сможет ли компилятор в случае if else if else... сам составить карту?
V>Не ГИС часом пишешь?
скажем так, дорабатываю
Re[2]: Чем заменить if () else if() else if() else if() else
korzhik wrote:
> Здравствуйте, > > имею такой код: >
> aux::tokenizer::token tk = m_tok.current_token();
>
> if (is_command(tk))
> {
> if (std::strncmp(tk.ptr, "#PAGE_PLOT", tk.len) == 0)
> {
> parse_page_plot_cmd();
> }
> else
> if (std::strncmp(tk.ptr, "#WELL", tk.len) == 0)
> {
> parse_well_cmd();
> }
> else
> if (std::strncmp(tk.ptr, "#PWDW", tk.len) == 0)
> {
> parse_pwdw_cmd();
> }
> else
> if ()
> // . . .
> // и дальше штук двадцать
>
> > и я вот думаю менять его или нет: > может заменить эту конструкцию на std::map > или ещё какой вариант, который вы мне здесь, я надеюсь, подскажете. > а может оставить как есть, в надежде что компилятор сделает подобие map за меня?
Надежды, я думаю, нет.
Если бы мне нужен был бы absolute raw perfomance, я бы посчитал хэши для твоих контсант ("#PAGE_PLOT", "#WELL"), подобрав такую хэш ф-цию, чтобы хэши по модулю N для всех констант были уникальными. Далее я бы использовал массив[N] указателей на ф-ции.
Здравствуйте, Vamp, Вы писали:
V>оффтоп. V>Ллойд пхнул минус тебе, ты ллойду. А разъяснить за что?
Он видимо пнул мне за то, что я ему пнул. Учили видимо в детстве стоять за себя.
Я поставил минус потому что считаю, что вариант, предложенный Lorenzo_LAMAS-ом обладает как плохой читаемостью, так и плохой сопровождаемостью. И при этом ни одним преимуществом перед первоначальным вариантом не обладает.
Re[4]: Чем заменить if () else if() else if() else if() else
Здравствуйте, Lloyd, Вы писали:
L>Я поставил минус потому что считаю, что вариант, предложенный Lorenzo_LAMAS-ом обладает как плохой читаемостью, так и плохой сопровождаемостью.
да он же пошутил.
Re[3]: Чем заменить if () else if() else if() else if() else
K>в этом случае я бы пользовался std::map, быстрее обработчик искать будет.
а где-то было сказано, что надо быстрее?
использование std::map -- это вопрос оптимизации.
я тоже могу придумать ситуацию, когда std::map() для такой задачи будет не лучшим вариантом.
Re[2]: Чем заменить if () else if() else if() else if() else
Здравствуйте, MaximE, Вы писали:
ME>Если бы мне нужен был бы absolute raw perfomance, я бы посчитал хэши для твоих контсант ("#PAGE_PLOT", "#WELL"), подобрав такую хэш ф-цию, чтобы хэши по модулю N для всех констант были уникальными. Далее я бы использовал массив[N] указателей на ф-ции.
хорошая мысль. Будет свободное время, может сделаю.
Re[3]: Чем заменить if () else if() else if() else if() else
K>что элегантно это конечно хорошо, но карту(std::map) ещё заполнить надо:
Естественно.
K>получается конечно красивее, наверно так и переделаю, но меня больше в этом вопросе волнует скорость. K>То есть сможет ли компилятор в случае if else if else... сам составить карту?
Не знаю. Я бы на это не особо рассчитывал. Если хочешь скорости — составь не карту, а хэш-таблицу. Обеспечишь вызов функции за константное время.
V>>Не ГИС часом пишешь? K>скажем так, дорабатываю
Похоже на парсер las-файлов. Сам когда-то этим занимался.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Чем заменить if () else if() else if() else if() else
Здравствуйте, IamLexa, Вы писали:
K>>в этом случае я бы пользовался std::map, быстрее обработчик искать будет.
IL>а где-то было сказано, что надо быстрее? IL>использование std::map -- это вопрос оптимизации.
правильно, вопрос оптимизации.
предложенный тобой вариант аналогичен использованию std::map, только std::map быстрее будет выполнять поиск.
Вот я тебе об этом и написал.
ЗЫ
Всё равно спасибо за участие в дискуссии.
Re[4]: Чем заменить if () else if() else if() else if() else
Здравствуйте, Vamp, Вы писали:
K>>То есть сможет ли компилятор в случае if else if else... сам составить карту? V>Не знаю. Я бы на это не особо рассчитывал. Если хочешь скорости — составь не карту, а хэш-таблицу. Обеспечишь вызов функции за константное время.
пока сделаю std::map,
будет время подумаю над хэш-функцией
V>>>Не ГИС часом пишешь? K>>скажем так, дорабатываю V>Похоже на парсер las-файлов. Сам когда-то этим занимался.
с las'ами я тоже работаю, но сейчас это не las, а внутренний формат.
Re: Чем заменить if () else if() else if() else if() else if
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте,
K>имею такой код: K>
K> aux::tokenizer::token tk = m_tok.current_token();
K> if (is_command(tk))
K> {
K> if (std::strncmp(tk.ptr, "#PAGE_PLOT", tk.len) == 0)
K> {
K> parse_page_plot_cmd();
K> }
K> else
K> if (std::strncmp(tk.ptr, "#WELL", tk.len) == 0)
K> {
K> parse_well_cmd();
K> }
K> else
K> if (std::strncmp(tk.ptr, "#PWDW", tk.len) == 0)
K> {
K> parse_pwdw_cmd();
K> }
K> else
K> if ()
K> // . . .
K> // и дальше штук двадцать
K>
K>и я вот думаю менять его или нет: K>может заменить эту конструкцию на std::map K>или ещё какой вариант, который вы мне здесь, я надеюсь, подскажете. K>а может оставить как есть, в надежде что компилятор сделает подобие map за меня?
Только хотел предложить решение с хешами, да вот заметил пост Макса... Действительное, самое хорошее решение с точки зрения производительности, значительно лучше мапа. В строчном мапе каждый раз прийдется делать сравнение строк, в случае хеша ты только раз хешируешь входную строку и делаешь разрешение индекса на указатель на функцию, значительно дешевле. А заполнять массив не обязательно каждый раз в конструкторе, этот массив можно сделать статическим, он по логике не связан с конкретным инстансом твоего парсера.
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[2]: Чем заменить if () else if() else if() else if() else
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, korzhik, Вы писали:
K>>и я вот думаю менять его или нет: K>>может заменить эту конструкцию на std::map K>>или ещё какой вариант, который вы мне здесь, я надеюсь, подскажете. K>>а может оставить как есть, в надежде что компилятор сделает подобие map за меня?
L>Почитай про паттерн state. Возможно, он тебе подойдет.
а при чем здесь state, может быть command ?
Re: Чем заменить if () else if() else if() else if() else if