Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать правильней? 
V
    Опции темы
andrew_121
Дата 20.6.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Ситуация следующая.
Есть набор строк.
Код

static const char *sources_ext[] = {
    "c",
    "cc",
    "cpp",
    "cxx"
};

static const char *header_ext[] = {
    "h",
    "hh",
    "hpp",
    "hxx"
};

static const char *resources_ext[] = {
    "res",
    "rc"
};

static const char *objects_ext[] = {
    "o",
    "obj"
};

static const char *lib_ext[] = {
    "a",
    "lib"
};

static const char *dynlib_ext[] = {
    "so",
    "dll"
};

Есть расширение файла в виде строки. По расширению нужно определить тип файла.
Это можно сделать при помощи функций.
Код

bool is_cppfile(const QString&);
bool is_cfile(const QString&);
bool is_hfile(const QString&);
bool is_objfile(const QString&);
bool is_rcfile(const QString&);
bool is_rcbinfile(const QString&);
bool is_staticlibfile(const QString&);
bool is_dynlibfile(const QString&);
bool is_unknownfile(const QString&);

Но как-то нелепо smile 

Нужно чтоб функция:
Код

typedef enum {
    cppfile,
    cfile,
    hfile,
    objfile,
    rcfile,
    rcbinfile,
    staticlibfile,
    dynlibfile,
    unknownfile
} types;

types determine_filetype(const QString&);

возвращала тип файла.

Предложите что нить более правильное.

Спасибо!

Добавлено @ 18:57
П.С.
Не знаю куда отнести .def файл.
Дополните пожалуйста расширения файлов. Если что-то пропустил.

Это сообщение отредактировал(а) andrew_121 - 20.6.2009, 19:25


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 20.6.2009, 19:21 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(andrew_121 @  20.6.2009,  18:56 Найти цитируемый пост)
Предложите что нить более правильное.

ассоциативный массив не хотите завести?
Код

map<sting /* name */, eType /* enum: cpp, c, etc */ > extension;
eType result = extension["lib"];
// result contains staticlibfile

***
только имейте ввиду, что эта строчка
Код

eType result = extension["lib"];

будет выполняться весьма специфически smile
т.е. если "lib" будет найдено - вернётся его значение.
если не найдено - ключ lib создастся со значением по умолчанию для типа eType
так что более правильно через функцию map::count проверять есть ли элемент в map или нет ;)

Это сообщение отредактировал(а) zim22 - 20.6.2009, 20:02


--------------------
PM MAIL   Вверх
andrew_121
Дата 20.6.2009, 19:27 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(zim22 @  20.6.2009,  19:21 Найти цитируемый пост)
ассоциативный массив не хотите завести?

Т.е. Все категории запихнуть в один массив? Вариант!



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
nix_crash
Дата 20.6.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Это я, Andrew_121. Получил бан. Не понятно за что... Наверное за нелюбовь к виндавз smile


По теме:
Цитата(zim22 @  20.6.2009,  19:21 Найти цитируемый пост)
т.е. если "lib" будет найдено - вернётся его значение.
если не найдено - ключ lib создастся со значением по умолчанию для типа eType


Да. Естественно. Уже сделал.
Спасибо за помощь!

Тема закрыта.

Добавлено через 1 минуту и 15 секунд
ГЫ smile 
Закрою когда бан вылечу smile
PM MAIL   Вверх
Любитель
Дата 21.6.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(zim22 @  20.6.2009,  19:21 Найти цитируемый пост)
так что более правильно через функцию map::count проверять есть ли элемент в map или нет ;)

Зачем count?! find - вернёт итератор для найденного элемента. Если он неравен myMap.end() - разыменовываем его и возвращаем, если равен - возвращаем какое-нибудь значение для неизвестного типа файла.


--------------------
PM MAIL ICQ Skype   Вверх
zim22
Дата 21.6.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Любитель @  21.6.2009,  11:31 Найти цитируемый пост)
Зачем count?! find - вернёт итератор для найденного элемента.

 smile 
count
Complexity: Logarithmic in size.

find
Complexity: At most, performs as many comparisons as the number of elements in the range [first,last).
***
ааа, понял! вы наверное имели ввиду не std::find из <algorithm>, а std::map::find smile
тогда да, согласен  smile smile

standard:
Цитата

a.find(k)  - logarithmic
a.count(k)  - log(size())+count(k)



Это сообщение отредактировал(а) zim22 - 21.6.2009, 11:52


--------------------
PM MAIL   Вверх
azesmcar
Дата 21.6.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



zim22

А зачем сравнивать std::map::count и std::find? Это не честно smile 
std::find - универсальный алгоритм, он работает на всех, STL совместимых контейнерах, но...универсальные алгоритмы не рекомендуется использовать на тех контейнерах, которые имеют свою собственную реализацию. Алгоритм find не может знать ничего он внутренней структуре map и потому ищет линейно.
PM   Вверх
Любитель
Дата 21.6.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(zim22 @  21.6.2009,  11:44 Найти цитируемый пост)
ааа, понял! вы наверное имели ввиду не std::find из <algorithm>, а std::map::find 

Естественно. ТЫ предлагаешь count, а затем ещё и индексатор. В плане производительности - один find (для бинарного дерева - с логарифмической сложностью само собой) будет лучше smile


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0797 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.