vector setów

pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Jak sie odwoływac do niego?
std::vector<std::set<int> > set;
set[i][u] wyrzuca mi błąd.


do not code, write prose
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:4 minuty
0

Przecież std::set nie ma operatora [].

pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Okej, więc zmiemian to na
std::vector<std::vector<int> > value;
Teraz jak wpisywać do tego vectora? Powiedzmy, ze chce stworzyc value[6][2] o wartościach {1,2}.
value.push_back(6);
value[6].push.back(1); value[6].push.back(2);
również wyrzuca błędy


do not code, write prose
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Może uogólnie ten problem. Chcę trzymać dane o takiej strukturze (przykład)
1: 1,5,8
2: 4,7,10
4: 2,3,6,9
i odwoływać się do tego w ten sposób:
costam[1] = {1,5,8}
costam[2] = {2,7,10}
costam[4] = {2,3,6,9}
tablica dwuwymiarowa nie wchodzi w gre. vector vectorów jest dobrym rozwiązaniem? Nie sądze, bo wtedy musiałbym miec vectory brakujących wartosci, dla przykładu wyżej:
0: 0
3: 0


do not code, write prose
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Mapa wektorów? map<int,vector<int> >


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

idealnie, dzieki wielkie.


do not code, write prose
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Kolejny problem, a nie chce zakładac nowego tematu
mam już tę mape vectorów
map<int,vector<int> > value;
i teraz chce to posortować według długości vectora
bool comp(vector<int> a, vector<int> b)
{
return a.size()>b.size();
}
sort(value.begin(), value.end(), comp);
To nie działa.


do not code, write prose
edytowany 1x, ostatnio: pingwindyktator
Azarien
Nie działa czyli co? ZAWSZE wyjaśniaj, na czym polega „nie działa”.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

To dość oczywiste bo przecież mapa to kontener asocjacyjny i on nie przechowuje kolejności tylko pary klucz wartość. Co niby chciałbyś uzyskać po takim sortowaniu? jak by to niby miało zadziałać? o_O


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Nie działa, tzn mam 106 linijek błędu kompilacji i odsyła mnie do algorithm.
Przechowuje to w ten sposób(schemat):
1: 2,3 (długosc: 2)
2: 6,7,8,9 (dlugosc: 4)
3: 1 (dlugosc: 1)
i chce posortować, zeby otrzymać
3: 1
1: 2,3
2: 6,7,8,9
To w ogole ma sens przy mapie vectorów? Po prostu chcę szybko wyszukiwac te vectory, ktorych dlugosc jest większa od x. Chciałem posortowac ale teraz widze, ze to jest całkowicie bezsensu.


do not code, write prose
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

I co? Chciałbyś w kolejności iterować po tej mapie? Mapa nie ma zadanej kolejności, przykro mi ;] Ale po co tak kombinujesz? Zrób sobie listę/vector indeksów w takiej kolejności w jakiej chcesz i za ich pomocą iteruj. Tzn w vectorze będziesz miał po prostu {3,1,2}


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
TA
Nie ma kolejności? Poza tym, jeśli wyciągnąłby poszczególne adresy za mapę, tam je posortował po rozmiarze wektorów, na które wskazują, mógłby skorzystać z wyszukiwania binarnego, aby znajdywać szybciej początek interesującego przedziału. Problem znany i zbadany, to nie będę opisywał. Google wiele powie na hasło "sort map of vector by size of vector c++".
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

To byłoby najłatwiejsze, ale problem w tym, ze nie wiem, jakie dostane wartosci. jeśli dostane
1: 1, 2
100000: 5, 6
to będe miał w przedziałe (1, 100000) same zera, a nie moge sobie na to pozwolić.
Ale mam pomysł.
vector<pair<int, vector<int> > > para;
wtedy będe przechowywał
para[0] = 1: 1, 2 (int: vector<int>)
para[1] = 100000: 5, 6
i będe mógł posortowac według długości vectora. Mam racje? I nie rozwali mi to pamięci? xd


do not code, write prose
TA
Tego nie rozumiem.
pingwindyktator
A rozumiesz, na jakiej zasadzie chce przechowywac dane? Jakoś nie potrafie wytłumacyzc tego lepiej, ale chyba tak to napisze.
TA
Tylko jeśli problemem jest nieposiadanie pustych wartości to map wydaje się być ok. Poza tym, jakie Ty masz ograniczenia, że aż tak się o to martwisz?
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Nie rozumiem twojego problemu, bo przecież w wersji z mapą masz klucze mapy i tyle je miałbyś w wektorze określającym kolejność. Bez żadnych zer. Ja rozumiem że klucze byłyby wartościami w wektorze.
Ale musisz odpowiedzieć nam na pytanie CO ty chcesz z tymi danymi zrobić, bo teraz to robisz jakieś cuda na kiju a nikt z nas nie wie jaki jest cel i trudno zaproponować rozwiązanie.

Mapa pozwala ci bardzo szybko odnosić się do danych na podstawie klucza, ale jeśli ty i tak chcesz mieć zadaną kolejność tych i iterować po nich w kolejności to mapa nie jest rozwiązaniem i faktycznie taki wektor par będzie lepszy.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Wektor par odpada, przed chwilą się zorientowałem. Spróbuje wyciągnąc klucze mapy i posortować je według długosci vectora w mapie o tym kluczu. Powinno byc okej.

Dalej nic z tego...
Moze wytłumacze problem od podstaw.
numer : 1|2|3|4|5|6|7|8|9
wejscie: 3|3|4|5|5|9|9|9|3
chce to trzymac w ten sposób, ktory przedstawia, na ktorej pozycji jest liczba n z wejscia:
n: {pozycje liczby n}
3: 1, 2, 9
4: 3
5: 4, 5
9: 6, 7, 8

I posortować to według ilości wystąpień liczby n:
3: 1, 2, 9
9: 6, 7, 8
5: 4, 5
4: 3

Puste pola odpadają, zatem chce poruszać sie po tym tylko:
costam[3]
costam[9]
costam[5]
costam[4]

Bez żadnych moich sugestii i pytań, bo mam błędy w kodzie - jak to zrobić?


do not code, write prose
edytowany 1x, ostatnio: pingwindyktator
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Niestety C++ nie ma standardowo LinkedHashMap ani niczego w tym stylu więc nadal uważam ze najsensowniejsze rozwiązanie to będzie map<int, vector<int> > do przechowywania danych i list<int> do przechowywania kolejności. Dla wygody pewnie dobry pomysł to zapakowanie tego w osobna klasę z iteratorem który pozwala na dostęp do danych z dobrej kolejności.
Ale to już napisałem wcześniej. W takim razie gdzie jest problem? Bo przecież implementacja tego to raczej bułka z masłem.

Kopiuj
map<int, vector<int> > mapa; //ładujesz dane do mapy
//wyciągasz klucze
list<int> keys;
for(map<int,vector<int> >::iterator it = mapa.begin(); it != mapa.end(); ++it) {
  keys.push_back(it->first);
}
//definujesz komparator:
bool compare(int key1, int key2)
 {
   return mapa[key1].size()>mapa[key2].size();
 }
//sortujesz klucze
lista.sort(compare);
//i voila, mozemy iteraować po mapie w naszej magicznej kolejności:
    for(list<ui>::iterator it = keys.begin(); it!=keys.end(); it++)
    {
        for(vector<ui>::iterator vecIt = mapa[*it].begin();vecIt!=mapa[*it].end();vecIt++){
            cout<<*vecIt<<" ";
        }
        cout<<endl;
    }

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 4x, ostatnio: Shalom
pingwindyktator
Dlaczego ++it, nie it++? Słyszałem, ze druga wersja jest szybsza. Źle słyszałem?
n0name_l
Druga wersja z zalozenia robi cos takiego: stworz kopie obiektu, inkrementuj obiekt, zwroc kopie obiektu. Natomiast pierwsza: inkrementuj obiekt.
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

for(list<int>::iterator it = keys.begin(); it!=keys.end();it++)
W tej linijce jest 6 błędów kompilacji.


do not code, write prose
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Jak nie zrobisz include <list> to mnie to nie dziwi... Na przyszłość POMYŚL zanim coś napiszesz.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

http://4programmers.net/Pastebin/2521
tam jeszcze cin>>n, bo edytowałem lekko kod po wkljeniu tutaj.


do not code, write prose
edytowany 1x, ostatnio: pingwindyktator
Shalom
nie kasuj swoich postów, szczególnie kiedy zaburza to porządek wątku!
pingwindyktator
Komentarz pod tym postem zdradzał zbyt wiele na temat całego tego wątku.
Shalom
Przesadzasz. Nie pytałeś tu przecież nigdzie o to jak rozwiązać jakiś konkretny problem algorytmiczny, tylko jak wykonać pewną trywialną transformację ;]
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Ty jesteś chłopie niepoważny. Raz ze bez sensu formatujesz kod przez co nie wiesz nawet w którym miejscu masz błąd (bo jest on przy wypisywaniu a nie przy pętli...) a dwa że log błędu jest chyba dość oczywisty i wystarczy pomyśleć zamiast stukać bezsensowne posty na forum.
Ja się oczywiście pomyliłem w moim poście powyżej bo zapomniałem że zawartością naszej mapy są WEKTORY. Nie da się tak wypisać wektora oczywiście...

Kopiuj
    for(list<ui>::iterator it = keys.begin(); it!=keys.end(); it++)
    {
        for(vector<ui>::iterator vecIt = value[*it].begin();vecIt!=value[*it].end();vecIt++){
            cout<<*vecIt<<" ";
        }
        cout<<endl;
    }

Jeśli planujesz przybiegać na forum z każdym takim problemem to poważnie zastanów się czy programowanie jest dla ciebie.

Nie. Kod formatuje się tak zeby byl czytelny a twój nie jest skoro nie potrafisz nawet odczytać gdzie pojawił się błąd. A już w ogóle jeśli chcesz się tym kodem gdzieś dzielić. Wtedy ma być czytelny też dla innych. Doceń to że poświęcamy tutaj nasz prywatny czas żeby ci pomóc i nam tego nie utrudniaj...
Powinienem zamknąć ten temat za twoje jakże dobrze opisane problemy

W tej linijce jest 6 błędów kompilacji.

tym razem przy sorcie

Ale mam dziś dobry humor. Rozumiesz że łatwiej byłoby gdybyś napisal JAKIE BŁĘDY?
Lista to nie vector i nie ma random access iteratora więc ma swojego sorta, co można w 10 sekund wyczytać z dokumentacji. Ale trzeba do niej zajrzeć a przecież łatwiej napisać na forum i niech ktoś szuka za nas? ...

Kopiuj
keys.sort(cmp);

Weź pod uwagę że kody wstawiane na forum zwykle są pisane z palca i często zawierają takie głupie błędy, które ty z kompilatorem powinieneś rozwiązywać od ręki.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.