Pozdrav!
Evo imam problema s STL-ima, tocnije s vektorom i mappingom, dvije funkcije, pa ako netko ima vremena i volje za pogledat kod i doradit neka se javi na pm.
Thnx unaprijed =)
Pozdrav!
Evo imam problema s STL-ima, tocnije s vektorom i mappingom, dvije funkcije, pa ako netko ima vremena i volje za pogledat kod i doradit neka se javi na pm.
Thnx unaprijed =)
Postaj ovdje.
1. funkcija
-prima vektor stringova, vraca vektor permutiranih stringova tako da su oni palindromi max duljine(ako za jedan string ima vise takvih vraca najmanji obzirom na leksikograf uredjaj, velika slova dolaze prie malih), prvo iz svakog stringa izbaci sve sto nije slovo; npr "abA", "bdc", "Dca", "abecbdac" - "Aba", "b", "D", "abcdcba"
#include<iostream>
#include<string>
#include<cctype>
#include<set>
using namespace std;
vector<string> permutirani_palindromi( vector<string> v){
string s;
vector<string> P;
for(int i=0; i<v.size(); i++) { s=v[i];
for(int j=0; j<s.size(); j++)
if(!isalpha(s[j])) s.erase(j); }
for(int i=0; i<v.size(); i++) { s=v[i];
multiset<char> S;
for(int j=0; j<s.length(); j++) S.insert(s[j]);
multiset<char>::iterator si; string p;
for(si=S.begin(); si!=S.end();){
if (!(S.count(*si)%2)) {p.insert(p.length()/2, S.count(*si), (*si) );
multiset<char>::iterator temp;
for(int k=0; k<S.count(*si); k++) {temp=si; si++;
S.erase(temp);}
}
if((S.count(*si)%2) && (S.count(*si)>1)){ p.insert(p.length()/2, S.count(*si)-1, (*si) );
multiset<char>::iterator temp;
for(int k=0; k<S.count(*si)-1; k++) {temp=si; si++;
S.erase(temp); }
}
if(S.count(*si)==1) si++;
}
for(si=S.begin(); si!=S.end();si++) if( S.count(*si)==1)
{p.insert(p.length()/2, 1, (*si)); break;}
P.push_back(p); }
return P;
}
ideja mi je bila za svaki string svaki char stavit u multiskup jer ce se tako odmah sortirat pa ce bit lakse nac max palindrome, al negdje sam ocito pogrijesila jer ne ispisuje sta bi trebala..
Nisam citao kod pa nisam siguran da ti je greska u algoritmu, ali jednu stvar uocavam:
vektor koji vracas je alociran na stack frameu, koji se normalno unistava kad se funkcija vraca. To ce izazvati segfault kad pristupis vracenom vektoru. Takodjer, vektor stringova koji predajes u funkciju se KOPIRA u stack frame funkcije, a otprilike sam 99% siguran da to ne zelis. Ako sam pogodio problem, onda imas dvije opcije:
a) alociraj vektor na heapu i vrati objekt zawrappan u auto_ptr ili nesto slicno
b) promjeni return vrijednost na void i predaj referencu na vektor pozivatelja kroz 'out' parametar, alociran na stacku
Moj savjet je b.
Dakle, promjeni funkciju
void blablaNestoUVeziPalindroma(vector<string>& in, vector<string>& out) {
// modificiraj out
}
Pa vidi da li radi.
P.S.
Downloadiraj si i iskompiliraj astyle i daj mu nek ti formatira kod. Ne razumijem kako mozes citati ove spagete, a kamoli debugirati.
vektor koji vracas je alociran na stack frameu, koji se normalno unistava kad se funkcija vraca. To ce izazvati segfault kad pristupis vracenom vektoru. Takodjer, vektor stringova koji predajes u funkciju se KOPIRA u stack frame funkcije, a otprilike sam 99% siguran da to ne zelis. Ako sam pogodio problem, onda imas dvije opcije:
Stvarno sam ostario.
Moja greska.
Hehe, np, događa se svima.
Što se tiće koda, nisam cijeli pročitao, ali primjetio sam na početku da u for petlji brišeš znakove, a ne smanjuješ brojač - neki znakovi će se preskočiti.
@Deus ex machina
mora bit tocno onaj prototip, to je zadatak za dz i inzistira se na tom... ostatk sam slabo shvatila, nisam potpuni pocetnik, al ni daleko od toga..
@itf4n
da, i ja sam primijetila to, al ne mogu direktno smanjit s.length(), vraca error, ako pak uvedem novu var l=s.length() i nju smanjim kod izbacivanja opet se ne izbaci sve sta bi trebalo.. savjet?
@Deus ex machina
mora bit tocno onaj prototip, to je zadatak za dz i inzistira se na tom... ostatk sam slabo shvatila, nisam potpuni pocetnik, al ni daleko od toga..
@itf4n
da, i ja sam primijetila to, al ne mogu direktno smanjit s.length(), vraca error, ako pak uvedem novu var l=s.length() i nju smanjim kod izbacivanja opet se ne izbaci sve sta bi trebalo.. savjet?
ja imam mali problemcic kada kompajliram javlja mi gresku a sve mi se cini da valja
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
float a = 2.71;
float b = static_cast<int>a;
cout<<b<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Ovako na brzinu:
float b =static_cast<int>(a);
Znači zagrade ,a imaš i gubitak podataka pri castanju ....
Ima i boljih castanja i načina na koji se casta ali eto samo sam letimično pogledao...
procitao sam da ima boljih tek se ucim
EDIT a u knjizi pise bez zagrade ne znam jel to u sklopu zadatka namjerno napravljena ta greska il sta...
Hmm, pa ovaj način se preporuča... ima jednostavnijih, ali ovo je "najispravniji".
edit: onda je krivo u knjizi, mora biti ()
Koja je to knjiga..hmmmm....ne brini i na greškama se uči katkad i bolje nego da je sve ok...
demistificirani c++
demistificirani c++
Oo.
Daj stranicu i izdanje :O
2. izdanje str.51
Uff, stvarno. (Iako, u zadatku je, možda su ciljali na to da skužiš kako je greška što fale zagrade).
mozda sam sto ja nisam skuzio trebao bih pripazit na zagrade