Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Defake
5 / 5 / 0
Регистрация: 24.08.2011
Сообщений: 191

Оптимизировать написание кода при string => enum

18.09.2015, 18:28. Показов 1529. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некий класс, в котором:

C++
1
2
3
4
5
6
7
8
9
10
public:
    virtual void InitClip(string state, Clip* clip) {
        if (state == "Idle") {
            this->clip[Idle] = clip;
        }
    }
 
protected:
 
    enum states { Idle };
В неком потомке код инициализации клипов уже превращается в:

C++
1
2
3
4
5
6
7
8
9
10
11
virtual void InitClip(string state, Clip* clip) {
        if (state == "Idle") {
            this->clip[Idle] = clip;
        } else if (state == "Walk") {
            this->clip[Walk] = clip;
        }
    }
 
protected:
 
    enum states { Idle, Walk  };
И при каждом потомке всё больше клипов. Как-то это неправильно, мне кажется. Есть способ автоматически "понимать", какой string к какому enum-элементу относится?

map<string, clip*> не предлагать - убивает нафиг всю оптимизацию
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2015, 18:28
Ответы с готовыми решениями:

Написание кода для кнопки при нажатом checkbox
В общем сабж в следующем Есть несколько объектов checkbox если выбран к примеру checkbox1 то при нажатии кнопки commandbutton1 ...

Привести string к enum
Здравствуйте, мне нужно привести переменную типа string к enum, на такую запись enum_var =...

Преоброзование из Enum в string
Здраствуйте! Пожалуйста помогите.. Нужно преобразовать перечесление в string формат public class Library { public...

13
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.09.2015, 18:41
map<string, int>
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.09.2015, 18:44
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от Defake Посмотреть сообщение
map<string, clip*> не предлагать - убивает нафиг всю оптимизацию
Ну, unordered_map. В большинстве случаев будет давать константное время поиска элемента (хотя, если не повезет, то время подскочит до линейного).
2
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.09.2015, 19:42
Цитата Сообщение от Defake Посмотреть сообщение
map<string, clip*> не предлагать - убивает нафиг всю оптимизацию
копирование строк по значению вас не смущает:
C++
1
virtual void InitClip(string state, Clip* clip) {
а довольно таки быстрый поиск по дереву - напрягает...
ну и где логика?
0
 Аватар для Defake
5 / 5 / 0
Регистрация: 24.08.2011
Сообщений: 191
19.09.2015, 07:18  [ТС]
nmcf, если использовать map<string, int>, то, получается, в классе будет одна мапа, которая используется только при создании объекта. Не думаю, что держать неиспользуемую переменную всё существование класса будет хорошим решением.

hoggy, мда. Ну, логика в том, что это копирование строк производится единожды, при создании объекта. А очень долгий поиск по строковой мапе производится раз 60 в секунду для каждого объекта. Так что такой вариант слишком медленный.

Renji, про unordered_map посмотрю. Но нет все-таки способа узнать enum?
Видел вот такую тему: Привести string к enum
Но там узнается enum-элемент по индексу. А мне нужно по названию...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
19.09.2015, 08:35
Я, похоже, не понял, что ты хочешь. Вопрос был об упрощении if-else, так? Тогда какое отношение это имеет к созданию объектов?
Цитата Сообщение от Defake Посмотреть сообщение
логика в том, что это копирование строк производится единожды, при создании объекта. А очень долгий поиск по строковой мапе производится раз 60 в секунду для каждого объекта.
Тоже не понятно. Сам по себе if-else - тот же поиск с конструированием string, как вариант с map будет медленнее?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 10:51
Цитата Сообщение от Defake Посмотреть сообщение
что это копирование строк производится единожды
дважды.
на каждый ключ.
что не есть хорошо.
потому что операция выделения памяти - очень медленная.
это не считая копирования буковок.

Цитата Сообщение от Defake Посмотреть сообщение
А очень долгий поиск по строковой мапе производится раз 60 в секунду для каждого объекта.
вряд ли вы сделаете подобный поиск быстрее.
вопрос лишь в том: что именно нужно искать.

можно оптимизировать,
если использовать в качестве ключей не сами строки,
а их числовые хэши.

если возможные ключи известны заранее,
то можно приготовить хэши времени компиляции.

если порядок следования ключей в контейнере не важен,
то можно задействовать std::unordered_ptr<хэш, значение>
1
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
19.09.2015, 11:42
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от Defake Посмотреть сообщение
нужно по названию
Стандартный способ - использование Trie (ex. TST). Примеры реализаций: MARISA, Cedar, DASTrie.
Trie is a data structure of ordered tree that implements an associative array. Looking up a record key (usually a string) is very efficient, which takes O(1) with respect to the number of stored records n. Trie is also known for efficient prefix matching, where the retrieved key strings are the prefixes of a given query string.
2
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.09.2015, 13:51
Цитата Сообщение от Defake Посмотреть сообщение
nmcf, если использовать map<string, int>, то, получается, в классе будет одна мапа, которая используется только при создании объекта.
Объявите ее static, будет одна единственная мапа на все экземляры класса.
1
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
19.09.2015, 14:50
Почему бы не сделать отдельный класс state, содержащий в себе целочисленное значение и строковый литерал (и прочую ботву типа описания). И объявить глобально какой-нибудь контейнер, который будет хранить все доступные state и производить поиск и приведение string/char* к целочисленному виду? Заодно все строки будут в одном экземпляре. Тогда можно будет использовать switch, а не кучу if городить.
1
 Аватар для Defake
5 / 5 / 0
Регистрация: 24.08.2011
Сообщений: 191
21.09.2015, 08:14  [ТС]
nmcf, ну упрощение if-else производится в конкретном контексте с определенными условиями. А создание объектов тут при том, что:
Цитата Сообщение от Defake
Есть некий класс, в котором...
hoggy, единожды, дважды. Вы придираетесь. Я про то, что функция InitClip выполнится один раз при создании объекта. Соответственно и всё содержимое. Так что не суть, как оно там написано. В этом месте я пытаюсь оптимизировать быстроту написания кода (Про что, собственно, и сабж). Другое дело, что потом инициализированный клип(клипы) будет вызываться 60 раз в секунду, и там время операции имеет критическую важность. Один от шестидесяти отличается значительнее, чем один от двух, не правда-ли?

Renji, о, господи! Как я не догадался)) Спасибо, если с enum-ами в конце концов не получится, то сделаю статик мап.

Enno, зачем свитч? С вашим вариантом всё будет ок и функция InitClip будет в одну строчку. Только вот каждый раз обращаться к отдельному классу... Лучше уж строковые мапы.

gazlan, ох, придется, чувствую, попотеть, чтоб допереть, как это реализовывается.. Но, судя по описанию, это то, что нужно. Спасибо =)
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
21.09.2015, 09:56
Цитата Сообщение от Defake Посмотреть сообщение
как это реализовывается
Ternary Search Trees
In this article, we'll examine ternary search trees, which combine the time efficiency of digital tries with the space efficiency of binary search trees. The resulting structure is faster than hashing for many typical search problems, and supports a broader range of useful problems and operations. Ternary searches are faster than hashing and more powerful, too.
Structured Associative Containers
While the STL standard associative containers are normally backed by a binary tree structure, Structured Containers are backed by a Ternary Search Tree, as presented by Jon Bentley and Robert Sedgewick in [1].

Class ternary_tree<Key, Value, Comp, Alloc> provides the implementation backend. Due to its internals, its interface cannot easily be made to conform with standard STL concepts, so it is used internally by the structured* wrapper classes (much like STL's internal rb_tree class).

Basically, if you have code using sets or maps, you have code to use structured containers. And with 1-3 lines of code, you're ready to make advanced imprecise searches in your dictionaries.
1
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
21.09.2015, 10:00
Цитата Сообщение от Defake Посмотреть сообщение
Только вот каждый раз обращаться к отдельному классу...
Класс один, контейнер один.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.09.2015, 10:06
Цитата Сообщение от Defake Посмотреть сообщение
Вы придираетесь
да мне как бы фиолетово.
нравится вам без всякой причины зазря делать копии объектов - делайте.

Цитата Сообщение от Defake Посмотреть сообщение
Один от шестидесяти отличается значительнее, чем один от двух, не правда-ли?
ну и к чему это было сказано?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.09.2015, 10:06
Помогаю со студенческими работами здесь

написание кода движения 1го обьекта внутри другого при помоши клавиш
надо сделать програму в JavaScript чтобы заданная мной картинка двигалась в зависимости от нажатых клавиш внутри другой картинки...(ну...

При создании enum 'имя1' class 'имя2' ошибка use of enum 'имя1' without previous declaration
Добрый день. пишу в qt5: enum typeTable class tabty{readtxt,is,wb,wa,tp}; При сборке выдает ошибку: ...

Подобие Enum для String
Доброго дня, уважаемые форумчане! Имеем некоторую сущность &quot;Properties&quot;: class Props { public string name; ...

Вывод Enum в метод String
я новичек так сказать, учу сам, поэтому банальный вопрос как сделать вывод через метод String, поля Enum Days. выделю место где не знаю...

Получение строки из R.string в коде enum
Доброго времени суток. Есть FragmentPagerAdapter, который получает фрагменты из enum. Сейчас код enum выглядит так: public enum...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru