Wektor par wektorów i brak dostępu.

0

Problem wygląda następująco:

typedef pair<string,int> typ;
typedef vector<typ> list;
typedef pair<int , list> weks;
typedef vector<weks> wektor;

list pary;                    //przechowuje nazwe zmiennej i jej potege
wektor temp;             //przechowuje wspolczynnik jednomianu i jego elementy zapisane w wektorze list
wektor temp2;           //to samo tylko przeciwne wspolczynniki

Wektory te są umieszczone w różnych klasach ale to raczej nie ma wielkiego znaczenia. Feralny fragment kodu:

wielomian::wielomian(wektor temp2)    //konstruktor tworzący wielomian z podanych w wektorze danych
       {
       iter1=temp2.begin();
       iter2=temp2.end();
       for ( ; iter1!=iter2;iter1++)  //tyle ile istnieje wektorów temp2 czyli ile jednomianow w wielomianie
           {
           char a0[10];
           sprintf(a0, "%d" , (*iter1).first);   //zapisz w a0 kolejne wspolczynniki
           text+=a0;             
           
  //do tego momentu nie ma problemu

                   for ( ; (*iter1).second!=(*iter2).second ;  iter1++)   //tyle ile zmiennych w jednomianie
                       {
                       char st[10];
                       sprintf(st , "%d" , (*iter1).second.second);             // tu wywala bład
                       text+= O + (*iter1).second.first + T + st + Z;        //tu tez
                       }
           }
       }

Kompilator wyrzuca:
'class list' has no member named 'second'
'class list' has no member named 'first'

Nie potrafie sobie z tym poradzić - nie potrafię się dostać do elementów temp2( int , list). Do elementu int nie mam problemow zeby sie dostac wiec czemu nie moge odczytac danych z list? Probowalem to robić przy pomocy kolejnych iteratorów - bez skutku.

0

Jak odczytać danych z list? Te typedefy są paskudne, ale sobie poradzimy...
(*iter1).second to instancja vector<pair<string, int> >, tak? Vector, a do całego wektora się tutaj odwołujesz, nie ma elementu second, ma go jego konkretny element - odwołuj się do konkretnego, dopiero potem do składowej. Jakieś iter1->second.begin()->second czy coś, za Chiny nie rozumiem co chcesz uzyskać.

0
wielomian::wielomian(wektor temp2)    //konstruktor tworzący wielomian z podanych w wektorze danych weks( wspolczynniki ; jednomiany(zmienne ; potegi))
       {
       iter1=temp2.begin();
       iter2=temp2.end();
       for ( ; iter1!=iter2;iter1++)  //tyle ile istnieje wektorów temp2 czyli ile jednomianow w wielomianie
           {
           char a0[10];
           sprintf(a0, "%d" , (*iter1).first);   //zapisz w a0 kolejne wspolczynniki
           text+=a0;             
           iter_tmp=(*iter1).second;
           iter_tmp1=iter_tmp.begin();
           iter_tmp2=iter_tmp.end();
           
           
                   for ( ; iter_tmp1!=iter_tmp2 ;  iter_tmp1++) //tyle ile zmiennych w jednomianie
                       {
                       char st[10];
                       sprintf(st , "%d" , (*iter_tmp1).second);
                       text+= O + (*iter_tmp1).first + T + st + Z;
                       }
           }
       }

Oto wersja z zastosowanymi twoimi poradami (zarazem pierwotna wersja rozwiazania tego problemu). Jednak dalej nie chodzi tak jak powinno nie wiem dlaczego ale pętla nie wykonuje sie ani razu, kazdy element second jest rowny zero. wtf!? na pewno przynajmniej kilka elementow jest zapisanych w tym wewnetrznym wektorze par.

0

a czy to nie jest przypadkiem zwykły konflikt oznaczeń?
Pamiętaj, że istnieje taki szablon jak list (brat vector'a). Nawet jeśli nie to jest problemem powinieneś to poprawić bo może powodować później nieporozumienia.
Zresztą cała twoja koncepcja nazewnictwa nie mówi nic co to właściwie jest, np co to ma być typ?

0

Niemożliwe, przede wszystkim list to szablon, nie konkretny typ, typedef zaś przesłania.

0

Najistotniejsze w mojej wypowiedzi jest to, że to może prowadzić do nieporozumień, inaczej mówiąc w dobrym programie TAK się NIE ROBI i nie ma znaczenia, czy kompilator na to pozwala czy nie.
Zresztą biorąc pod uwagę zawiłość struktury danych to jej nazewnictwo woła o pomstę do boga.

A co do właściwego tematu, to wygląda na to, że mam z tym racje i autor sam zaplątał się w swojej strukturze danych.
Po kolei rozwikłując typy:
iter1 wektor::iterator
(*iter1).second (pisząc normalnie: iter1->second) list (czyli vector<typ>)
aha czyli (*iter1).second.second jest bezsensu! Najprawdopodobniej zginął gdzieś operator [] np:
(*iter1).second[1].second

0

Zawsze można to przekompilować i odpalić po dodaniu

cout << typeid(temp2).name() << endl;

i od razu wiadomo co jest co.

... nie żebym takie nazewnictwo popierał, za coś takiego powinno się wieszać.

0

poprawiłem swego ostatniego posta gdy się pojawił nowy, więc patrz wyżej.

0
MarekR22 napisał(a)

Najistotniejsze w mojej wypowiedzi jest to, że to może prowadzić do nieporozumień, inaczej mówiąc w dobrym programie TAK się NIE ROBI i nie ma znaczenia, czy kompilator na to pozwala czy nie.
Zresztą biorąc pod uwagę zawiłość struktury danych to jej nazewnictwo woła o pomstę do boga.

A co do właściwego tematu, to wygląda na to, że mam z tym racje i autor sam zaplątał się w swojej strukturze danych.
Po kolei rozwikłując typy:
iter1 wektor::iterator
(*iter1).second (pisząc normalnie: iter1->second) list (czyli vector<typ>)
aha czyli (*iter1).second.second jest bezsensu! Najprawdopodobniej zginął gdzieś operator [] np:
(*iter1).second[1].second

Co do nazywnictwa to może i nie jest zbyt czytelne, ale mi mówi wiele i wydaje się ok, nie to jest jednak ważne. Nazwe list zmienilem na inna - nie zmieniło to jednak nic w działaniu programu. Co do indeksowania to w poprzednim kodzie który zamiescilem zostalo to rozwiazane. Tyle tylko ze z jakiegos powodu petla sie nie wykonuje ani razu. Probowalem tez indeksowac - program sie kompiluje ale po uruchomieniu wywala bład :/

0
       iter1=temp2.begin();
       iter2=temp2.end();
       for ( ; iter1!=iter2;iter1++)  //tyle ile istnieje wektorów temp2 czyli ile jednomianow w wielomianie
           {
...
           iter_tmp1=iter_tmp.begin();
           iter_tmp2=iter_tmp.end();
                   for ( ; iter_tmp1!=iter_tmp2 ;  iter_tmp1++) //tyle ile zmiennych w jednomianie

jestes w 100% pewien ze do obydwu petli chcesz stosowac TE SAME ZMIENNE ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1