Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сравнение в multimap, операции сравнения с key  
V
    Опции темы
wolver17
  Дата 19.3.2016, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! Делаю прогу по арифметическим операциям над нечёткими числами. Решил задавать нечёткое число через контейнер multimap, т.к. он удобен для использования связанных каким-либо образом 2-х чисел (нечёткое число состоит из 2-х частей, как дробь - числитель и знаменатель две части одного целого) + в отличие от map - могут быть повторения.
Операция "сложения" двух нечётких чисел требует чтобы их знаменатели суммировались, а числители находился минимум, а потом - максимум из всех минимумов. (матчасть нагляднее на скрине ниже, залил на гугл диск т.к. чёт глючит тут подгрузка фото)
Код

https://drive.google.com/file/d/0B35Q7HCU9LwOZ052UGpCT2RZODQ/view?usp=sharing

Я сделал два multimap для этих чисел и один результирующий, для их суммы:
Код

    multimap <float, float> multimap_X;
    multimap <float, float> multimap_Y;
    multimap <float, float> multimap_Result;

Дальше, отдельно посчитал сумму знаменателям и нашёл минимумы для числителей. теперь мой muptimap выглядит как табличка 4*4 элемента, в каждой ячейке которой идёт пара (числитель/знаменатель) <value, key>.
Но возникла проблема, осталось найти максимум из одинаковых числителей, а для этого мне нужно сравнить в цикле значение key 1-й пары и key следующей пары, на поиск банального максимума 2-х числел, как в обычном массиве. Т.е. я хочу чтобы если key1==key2 я мог бы найти max(value1, value2) для моего результирующего multimap_Result.
Код

for(it_r=multimap_Result.begin(),i=0;it_r!=multimap_Result.end();it_r++,i++)
    {
        for(j=0;j<m;j++)
        {
        if(comp(it_r->first,it_r->firnst))               //как тут сделать key1==key2 ?
            key_r=Maximum(it_r->second,(it_r)->second);  //и как тут передать value1, value2 для 1-й и 2-й пары?
        }
    }


Это сообщение отредактировал(а) wolver17 - 19.3.2016, 20:39
PM MAIL   Вверх
wolver17
Дата 21.3.2016, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всё, решил проблему, вопрос закрыт! smile 
Кому вдруг понадобится подобная работа с multimap ниже код, на форму добавить лишь компоненты Button1, Memo1 и желательно бы для красотульки multimap читать со StringGrid1:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Form1->Memo1->Clear();
    multimap<float,float> multimap_Result;               //создаём multimap   
    multimap_Result.insert (make_pair(11,100));       //инициализируем инсертами
    multimap_Result.insert (make_pair(22,200));
    multimap_Result.insert (make_pair(33,211));
    multimap_Result.insert (make_pair(22,300));
    multimap_Result.insert (make_pair(33,111));
    multimap_Result.insert (make_pair(22,180));
    multimap_Result.insert (make_pair(44,444));
    multimap_Result.insert (make_pair(33,50));

    float highest = multimap_Result.rbegin()->first;     // можно без инициализации
    float move_iter = multimap_Result.rbegin()->first;
    multimap<float,float>::iterator it_r = multimap_Result.begin();    //итератор для внешнего цикла
    multimap<float,float>::iterator it_r1 = multimap_Result.begin();  //итератор для внутреннего цикла
    int i,j,z, n=8; //n = размеру вашего multimap
    int count=0; //счётчик, во внутреннем цикле, который считает к-во удалённых элементов и уменьшает итерации цикла на эту величину
    for(it_r=multimap_Result.begin(),i=0;it_r!=multimap_Result.end(),i<(n-count);it_r++,i++)
    {
    highest=it_r->first;
    float hi=it_r->second;  //не нужно, держал чисто для debug'a
        for(it_r1=multimap_Result.begin(),j=0;it_r1!=multimap_Result.end(),j<(n-count);it_r1++,j++)
        {
        move_iter=it_r1->first;
        float move_sec=it_r1->second;   //не нужно, держал чисто для debug'a
            if((move_iter==highest)&&(i<j))     //если ключи совпадают и значения находятся над главной диаг. и обязательно их итераторы 
            {                                                    //не равны чтобы удалять только одинак. по ключам элем, но не 1-й найденный (самого себя)
                it_r->second=Maximum(it_r->second,(it_r1)->second);  //поиск мах value для одинак. ключей, в проге ни на что не влияет
                multimap_Result.erase(it_r1);    //удаляем 2-й одинаковый элемент с ключом, что находится на позиции итератора it_r1
                count++;                                   //к-во удалённых элементов  
                i--;                                             //уменьшаем счётчик внешнего цикла, нужно чтобы сделать ниже break и прервать цикл
                it_r--;                                         //уменьшаем итератор внешнего цикла, для тех же целей
                break;
            }
        }
    }
    for(it_r=multimap_Result.begin(),i=0;it_r!=multimap_Result.end();it_r++,i++)
    {
        Form1->Memo1->Lines->Add(AnsiString((*it_r).first)+" ===> "+AnsiString((*it_r).second)+" ~~ i= "+AnsiString(i));
    }
}
//---------------------------------------------------------------------------

PM MAIL   Вверх
xvr
Дата 21.3.2016, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



multimap в данном случае совершеннр неоправданный выбор. Как просто map так multimap применяют когда надо что то упорядочить по значению ключа. У вас это не используется, а используется простой обход всего контейнера. 
Вам лучше использовать банальный list<pair<float,float> >

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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