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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> stl::map с классами, поиск сортировка и т.п. 
:(
    Опции темы
Step
Дата 16.4.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



имею
Код

class CInfoInstrumentProp
{
public:
    CInfoInstrumentProp(void);
    CInfoInstrumentProp(CString a_n, CString a_t){
        name=a_n;
        type=a_t;        
    }
    CString name;
    CString type;
    int all;
    CString tip[5];
    CString otip[5];
    ~CInfoInstrumentProp(void);
};
map<CString, CInfoInstrumentProp> p_instrument_info;
    typedef map<CString, CInfoInstrumentProp>::value_type p_instrument_infoType;
    map<CString, CInfoInstrumentProp>::iterator p_instrument_info_it;






вообщем задача простейшая, ввиду трудностей работы с БД ассеss связанных с специфическим методом выполнения полседовательностей скюл команд принято решения на этапе работы программы подменить бд ассоциативным массивом... параметром которых являеться структура

необходимо организовать поиск и сортировку массивов

понятно что нужно использовать find_if и sort c предикатом..


прошу специалистов либо по шагам объяснить либо написать код

по примеру из мсдн я понимаю как написать предикат для поиска, но не понимаю как туда запихнуть значение на условия..

и главное я не понимаю как с этим работать когда записей будет много

спасибо


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
chipset
Дата 16.4.2005, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(Step @ 16.4.2005, 00:44)
необходимо организовать поиск и сортировку массивов

В ассоциативном массиве все данные и так лежат отсортированными.
Тебе надо лишь перегрузить оператор "<" (меньше) чтобы map мог отсортировать их..
...
Кроме того, я не пойму зачем ты используешь map когда можно ограничиться простым vector'ом?

Цитата(Step @ 16.4.2005, 00:44)
по примеру из мсдн я понимаю как написать предикат для поиска, но не понимаю как туда запихнуть значение на условия..

К примеру предикат:
Код

bool InfoInstrumentChecker(CInfoInstrumentProp _prop)
{
/*условие
можешь делать всё что угодно главное верни true или false*/
}


Цитата(Step @ 16.4.2005, 00:44)
вообщем задача простейшая, ввиду трудностей работы с БД ассеss связанных с специфическим методом выполнения полседовательностей скюл команд принято решения на этапе работы программы подменить бд ассоциативным массивом... параметром которых являеться структура

А кроме Access альтернатив нету?


Цитата(Step @ 16.4.2005, 00:44)
и главное я не понимаю как с этим работать когда записей будет много

Из-за скорости переживаешь? Могу посоветовать качнуть STLPort (http://stlport.org), гораздо быстрее..


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Step
Дата 16.4.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



Цитата(chipset @ 16.4.2005, 10:59)
В ассоциативном массиве все данные и так лежат отсортированными.
Тебе надо лишь перегрузить оператор "<" (меньше) чтобы map мог отсортировать их..
...

не катит так как один раз по одному полю другой раз по другому а в третий по двум я буду вычислять что меньше
Цитата(chipset @ 16.4.2005, 10:59)
А кроме Access альтернатив нету?

я бы сказал что это проблема не только аксеса...



--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
chipset
Дата 16.4.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Если хочешь динамически создавать запросы на поиск:
1) Перегрузи оператор "==" у класса.
2) Вызывай функцию find, например так:
Код

find(smthng.begin(),smthng.end(), new CInfoInstrumentProp(/*параметры*/);


Добавлено @ 11:04
Цитата(Step @ 16.4.2005, 01:03)
не катит так как один раз по одному полю другой раз по другому а в третий по двум я буду вычислять что меньше

sort из <algorithm> подойдет?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Step
Дата 16.4.2005, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



Цитата(chipset @ 16.4.2005, 11:03)
find(smthng.begin(),smthng.end(), new CInfoInstrumentProp(/*параметры*/);

в этом случае я должен буду проверять в == какое поле установлено, а какое нет - не катит так как я перегружаю уже = и он уменя если объект существует то производит замену а одно поле просто уменьшает на 1
если не установлено то заполняет и одному полю присваивает 3, а искать придеться и по этому полю...

Добавлено @ 11:14
Цитата(chipset @ 16.4.2005, 11:03)
sort из <algorithm> подойдет?

подойдет, вот про предикат сорта мне тоже интересно, хотя я уже врубил...


отказаться от ассоциативного массива я не могу


и еще одно. как проверить что в маре нет объекта с заданным ключом не используя поиска

ну типа
a=p_instrument_info["step"];
он мне в а NULL вернет или нет


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
chipset
Дата 16.4.2005, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(Step @ 16.4.2005, 01:07)
какое нет - не катит так как я перегружаю уже =

А в чём взаимосвязь между == и =?
Первое оператор сравнения, второе оператор присваивания. Сейчас тебе ничего присваивать не нужно.
Добавлено @ 11:19
Цитата(Step @ 16.4.2005, 01:07)

ну типа
a=p_instrument_info["step"];
он мне в а NULL вернет или нет

Проверь smile
Цитата(Step @ 16.4.2005, 01:03)
не катит так как один раз по одному полю другой раз по другому а в третий по двум я буду вычислять что меньше

Если ты хочешь использовать стандартный ассоциативный массив STL тебе в любом случае придется перегружать "<", без этого не запашет.
Если надо избежать, то придется использовать метод симулирования хэша вектором, Майерса (Effective STL, #23).


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Step
Дата 16.4.2005, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



Цитата(chipset @ 16.4.2005, 11:14)
А в чём взаимосвязь между == и =?
Первое оператор сравнения, второе оператор присваивания. Сейчас тебе ничего присваивать не нужно.

при сравнении мне нужно будет определить по какому полю сравнивать

а = будет написанно таким образом что для каждого поля уже чето выставлено будет... ну тобишь конструктор по умолчанию будет заполнять поля какимито значениями, причем при каждом вызове конструктора по умолчанию значения будут разными..


вопрос в том как узнать по какому полю провести сравнения
Цитата(chipset @ 16.4.2005, 11:14)
Проверь

Понял smile
Цитата(chipset @ 16.4.2005, 11:14)
Если надо избежать, то придется использовать метод симулирования хэша вектором, Майерса (Effective STL, #23).

вот примерно так до сегодняшнего момента и было



--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
chipset
Дата 16.4.2005, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(Step @ 16.4.2005, 01:23)
вопрос в том как узнать по какому полю провести сравнения

Ухх... А у меня ещё более сумасшедший вариант так шо не подумайте:
Сделать функтор - класс у которого перегружен оператор ().
Сообщить функтору по каким полям ты хочешь произвести поиск.
Попытаться подсунуть вместо предиката sort функтор smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Step
Дата 16.4.2005, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



Цитата(chipset @ 16.4.2005, 11:34)
функтор

вот тут ты меня и сломалsmile это че за х..ь такая


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
chipset
Дата 16.4.2005, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(Step @ 16.4.2005, 01:37)
вот тут ты меня и сломалsmile это че за х..ь такая

Типа такого:
Код

class functor
{
public:
 int i;
 operator() {}//перегрузили оператор ()
};
//и теперь можем делать так
void main()
{
 functor func1;
 func1.i = 0;//вот так
 func1();//и так
}



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Step
Дата 16.4.2005, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



chipset, круто, спасибо...


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
chipset
Дата 16.4.2005, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



В общем функтор это обьект ведущий себя как функция и обьект одновременно.
Пардон, опечутка:
Код

 operator()() {}//перегрузили оператор ()

Добавлено @ 11:50
И в качестве предиката работает. Такой пример компилицца на ура:
Код

#include <algorithm>
#include <vector>
using namespace std;


class functor
{
public:
    int i;
     bool operator()(int a, int b)
    {
        return true;
    }//перегрузили оператор ()
};
//и теперь можем делать так
void main()
{
    functor func1;
    func1.i = 0;//вот так

    vector<int> a;
    sort(a.begin(),a.end(),func1);
}



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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