e questo come si realizza
![]()
e questo come si realizza
![]()
assomiglia molto a:codice:i=i++
http://gcc.gnu.org/bugs/#nonbugs_c
ma ok come ti sta descrivendo shodan, non è l'unico problemaModifying a value twice between two sequence points as shown in the following examples is even worse:
This leads to undefined behavior (i.e. the compiler can do anything).codice:i=++i
;-)
Ok, oggi pomeriggio ci provo...In pratica puoi copiare in un colpo solo il numero di elementi dettati dal vettore più corto. Se a ha dimensione 4 e b dimensione 5, puoi copiare al massimo 4 elementi di entrambi i vettori nel vettore c senza superare la dimensione massima di nessuno dei tre ( il vettore c è dimensionato in base alla somma delle dimensioni dei due vettori, in questo caso 4+5=9). a lo copi negli indici pari di c, b lo copi negli indici dispari di c. Alla fine c conterrà 8 elementi alternati. Dopo di che si tratta di trovare il vettore più lungo e copiare il resto di quel vettore nel vettore c.![]()
Ci sono riuscito, ecco il codice completo:
codice:#include<iostream> #include<vector> using namespace std; vector <int> merge (vector <int> a, vector <int> b) { vector <int> c (a.size()+b.size()); int i=0; int j=0; int k=0; int m=1; if (a.size()<b.size()) {for (i; i<a.size(); i++) {c[j]=a[i]; j=j+2;} for (k; m<(a.size()+b.size())-1; k++) {c[m]=b[k]; m=m+2;} c[(a.size()+b.size())-1] = b[b.size()-1];} if (a.size()>b.size()) {for (i; i<a.size(); i++) {c[j]=b[i]; j=j+2;} for (k; m<(a.size()+b.size())-1; k++) {c[m]=a[k]; m=m+2;} c[(a.size()+b.size())-1] = a[b.size()-1];} return c; } void print (vector <int> s) { for (int i=0; i<s.size();i++) cout << s[i] << endl; } int main() { vector <int> a(5); a[0]=1; a[1]=4; a[2]=9; a[3]=16; a[4]=21; vector <int> b(4); b[0]=9; b[1]=7; b[2]=4; b[3]=9; cout << endl; vector <int> c; cout << endl; c = merge (a,b); print (c); return 0; }
Ancora troppo macchinosa (e ancora non cosideri il caso che i due vettori siano lunghi uguali). Questa versione è più semplice ed efficiente.
codice:vector <int> merge (const vector<int>& a, const vector<int>& b) { vector <int> c (a.size()+ b.size()); size_t minsz = std::min(a.size(),b.size()); for (size_t i=0, j=0; j < minsz; i+=2,j++) { c[i] = a[j]; c[i+1] = b[j]; } const vector<int>& d = ( a.size() > b.size()) ? a : b; size_t maxsz = d.size(); for (size_t i = minsz*2, j = minsz; j < maxsz; i++, j++) { c[i] = d[j]; } return c; }
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.
Si, ok, però così come lo hai scritto te, il codice ha delle cose che io non ho fatto in informatica, quindi non sarei in grado di scriverlo... Comunque anche la versione precedente che avevo postato presentava degli errori, il codice seguente invece anche se macchinoso, dovrebbe funzionare con qualsiasi numero di elementi, sia se il vettore a è più grande o viceversa se è più grande il b, o ancora se sono uguali...
codice:#include<iostream> #include<vector> using namespace std; vector <int> merge (vector <int> a, vector <int> b) { vector <int> c (a.size()+b.size()); int i=0; int j=0; int m=1; int n; int f=0; int g; if (a.size()<b.size()) {for (i; i<a.size(); i++) {c[j]=a[i]; j=j+2;} for (f; m<(a.size()+b.size())-a.size(); f++) {c[m]=b[f]; m=m+2;} for (g=m;f<b.size();f++) { c[g]=b[f]; g++;}} if (a.size()>b.size()) {for (i; j<(a.size()+b.size())-b.size(); i++) {c[j]=a[i]; j=j+2;} for (f; f<b.size(); f++) {c[m]=b[f]; m=m+2;} for (g=j;f<a.size();f++) { c[g]=a[f]; g++;}} if (a.size()==b.size()) { {for (i; i<a.size(); i++) {c[j]=a[i]; j=j+2;} for (f; f<b.size(); f++) {c[m]=b[f]; m=m+2;}}} return c; } void print (vector <int> s) { for (int i=0; i<s.size();i++) cout << s[i] << endl; } int main() { vector <int> a(6); a[0]=1; a[1]=4; a[2]=9; a[3]=16; a[4]=20; a[5]=199; vector <int> b(3); b[0]=9; b[1]=7; b[2]=4; vector <int> c; c = merge (a,b); print (c); return 0; }
Quale parte di quello che ho scritto non hai fatto in informatica? Reference, puntatori? Operatore ternario?
Come "dovrebbe"dovrebbe funzionare con qualsiasi numero di elementi![]()
Hai provato a eseguirlo o no?
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.
Si, si, ho provato e funziona, però non si può mai dire che un programma funzioni perfettamente, visto che i casi possibili sono infiniti... Comunque non ho fatto reference e operatore ternario... Ho fatto vettori, puntatori, cicli iterativi, classi e oggi ho fatto ricorsività e ordinamento e ricerca...
Si, d'accordo, ma in questo caso sono tre in tutto.visto che i casi possibili sono infiniti...
Ok. Allora la mia funzione può essere riscritta così:puntatori
codice:vector <int> merge (vector<int> a, vector<int> b) { vector <int> c (a.size()+ b.size()); size_t minsz = 0; // Prendo la dimensione minore dei due vettori. if ( a.size() < b.size()) { minsz = a.size(); } else { minsz = b.size(); } // Copio i due vettori in c considerandoli di pari lunghezza. for (size_t i=0, j=0; j < minsz; i+=2,j++) { c[i] = a[j]; c[i+1] = b[j]; } // Scelgo il vettore di lunghezza maggiore. const vector<int>* d = 0; if ( a.size() < b.size() ) { d = &b; } else { d = &a; } // Copio il resto del vettore più lungo in c. // La locazione di partenza di c è pari al doppio di minsz. // La locazione di partenza del vettore più lungo è minsz. size_t maxsz = d->size(); for (size_t i = minsz*2, j = minsz; j < maxsz; i++, j++) { c[i] = (*d)[j]; } return c; }
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.