multimap - wstawianie obiektu

Dumel
Użytkownik
Użytkownik
Posty: 2000
Rejestracja: 19 lut 2008, o 17:35
Płeć: Mężczyzna
Lokalizacja: Stare Pole/Kraków
Podziękował: 60 razy
Pomógł: 202 razy

multimap - wstawianie obiektu

Post autor: Dumel »

mam sobie kontener

Kod: Zaznacz cały

multimap<int, int, less<int> > A
i chcę wstawić do niego obiekt b o kluczu a. jak to zrobić? wydawało mi sie że tak:

Kod: Zaznacz cały

A.insert(a,b)
ale nie działa
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

multimap - wstawianie obiektu

Post autor: kadiii »


Tak napiszę dla pewności bo ktoś inny może potrzebować

Kod: Zaznacz cały

A.insert ( pair<int,int>(a,b) ); 
Dumel
Użytkownik
Użytkownik
Posty: 2000
Rejestracja: 19 lut 2008, o 17:35
Płeć: Mężczyzna
Lokalizacja: Stare Pole/Kraków
Podziękował: 60 razy
Pomógł: 202 razy

multimap - wstawianie obiektu

Post autor: Dumel »

co jest nie tak z tym kodem?

Kod: Zaznacz cały

#include<stdio.h>
#include<vector>
#include<map>
using namespace std;
//---------------------------------------------------------------------------

int main()
{
        int Z,n,k;
        scanf("%i", &Z);
        vector<int> a;
        vector<int> w;
        int temp;
        multimap<int, int, less<int> > MAX;              
        for(int numerek(0); numerek<Z; ++numerek)
        {
            a.clear();
            MAX.clear();
            scanf("%i%i", &n,&k);
            a.resize(n);
            w.resize(n);
            for(int i(0); i<n; ++i)
                scanf("%i", &a[i]);
            for(int i(0); i<k; ++i)
                MAX.insert(pair<int,int>(0, i));

            for(int i(0); i<n; ++i)   //*********************
            {
                 multimap<int, int, less<int> >::iterator p =MAX.upper_bound(a[i]);
                 if(a[i]<p->first)
                 {
                        printf("NIE");
                        goto KONIEC;
                 }
                 else
                 {
                        w[i]=p->second;
                        temp=p->second;
                        MAX.erase(p);
                        MAX.insert(pair<int,int>(a[i], temp));
                 }
            }
            for(int i(0); i<n; ++i)
                printf("%i ", w[i]);
        KONIEC:
            printf("/n");

        }
        return(0);
}
//---------------------------------------------------------------------------
chcę aby w pętli oznaczonej gwiazdkami za każdym razem jak mamy a wyszukać element o największym kluczu nie przekraczającym a i podmienić ten klucz tą właśnie wartością, lub zakończyć gdy nie ma takiego elementu

i jeszcze na koniec wywala mi stack overflow, nie bardzo wiem dlaczego
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

multimap - wstawianie obiektu

Post autor: soku11 »

Po pierwsze: a co to ma niby robić? Nie ma żadnych komentarzy, ani nic. Nie mam pojęcia po co takie nieziemskie kombinacje z 3 wektorami, multimapą i jakimiś tymczasowymi zmiennymi... Pisane chyba bez przemyślenia, aby tylko działało - nie tędy droga.
Co do samego kodu:
Czemu stdio.h? Jeśli już, to cstdio. A najlepiej w C++ używać ... strumieni z C++. Nazwy zmiennych też takie bez systematyczności. Konstrukcja z goto - na pewno da się jej uniknąć. I to int numerek(0) i int i(0) - ogólnie zadziała. Jednak czy wiesz co to robi?
Co do wykrzaczania się - następuje to w linijce z "MAX.erase(p);". Czyli pewnie coś z iteratorem jest nie tak.

Pozdrawiam.
Dumel
Użytkownik
Użytkownik
Posty: 2000
Rejestracja: 19 lut 2008, o 17:35
Płeć: Mężczyzna
Lokalizacja: Stare Pole/Kraków
Podziękował: 60 razy
Pomógł: 202 razy

multimap - wstawianie obiektu

Post autor: Dumel »

Po pierwsze: a co to ma niby robić? Nie ma żadnych komentarzy, ani nic.
to rozwiązanie tego zadania: nie pisałem tego bo prosiłem o pomoc w konkretnym fragmencie a nie w samym algorytmie
Czemu stdio.h? Jeśli już, to cstdio. A najlepiej w C++ używać ... strumieni z C++.
zawsze używałem strumieni ale w ostatnim zadaniu które wysłałem dały mi przekroczenie limitu czasu, a przeróbka na te syfne printfy przechodzila testy gladko

a co do wektorów to wygodniej mi ich używać niż babrać się ze wskaźnikami
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

multimap - wstawianie obiektu

Post autor: soku11 »

Nie chodziło mi o treść zadania, tylko o wytłumaczenie kodu - jak to ma działać.

Napisałem, w którym miejscu jest problem. Pobaw się debuggerem, to może znajdziesz co go powoduje.
Pozdrawiam.
turb0
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 27 mar 2008, o 21:04
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Pomógł: 1 raz

multimap - wstawianie obiektu

Post autor: turb0 »

Hej,

Problem polega na tym, że nie uwzględniłeś tego, że MAX.upper_bound(a) zwróci Ci MAX.end() jeżeli a jest większe/równe od wszystkich elementów multimapy.

W pewnym momencie próbujesz usunąć ów MAX.end() co kończy się błędem wykonania.

Pozdrawiam,

Maciek
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

multimap - wstawianie obiektu

Post autor: matshadow »

Strumienie - to już zależy od gustu. Ale scanf i printf działają o wiele szybciej Żeby przyspieszyć działanie strumieni, dodaj sobie na początku maina linijkę

Kod: Zaznacz cały

ios_base::sync_with_stdio(0);
Wtedy powinno bez problemu przechodzić czasowo.
Co do goto, to słyszałem że lepiej tego używać
Dumel
Użytkownik
Użytkownik
Posty: 2000
Rejestracja: 19 lut 2008, o 17:35
Płeć: Mężczyzna
Lokalizacja: Stare Pole/Kraków
Podziękował: 60 razy
Pomógł: 202 razy

multimap - wstawianie obiektu

Post autor: Dumel »

wiem o desynchronizacji strumieni i zazwyczaj jest wystarczająca, ale w tamtym przypadku akurat nie była
ODPOWIEDZ