Tam Sürümünü Görmek İçin : std::vector
S.a.
vector le ilgili bir sorum var.
double cc[100][100] seklinde bir arrayim var. bu arraylarden 3 tanesini surekli vector icinde depolamak istiyorum.
soyle yaptim:
vector<double**> vcc(3);
vcc.push_back(cc);
sonrada bu datalara nasil ulasabilirim. ornegin birinci arrayin ilk elemanina
double birinci= vcc[0][0][0]; // yaptim ama calismiyor...
neyi yanlis yapiyorum?
tesekkurler
a.s.
vector<double **> vcc;
double **cc;
cc = (double**)malloc(5*sizeof(double));
*cc = (double*)malloc(5*sizeof(double));
// deneme amacli cc yi yukaridaki gibi rasgele boyutlu yaptim.
cc[0][0] = 2;
vcc.push_back(cc);
cout << **vcc.front();
// veya yukaridaki satir yerine cout << ***vcc.begin() ; de
//kullanabilirdin.
#include <cstdlib>
#include <iostream>
#include<vector>
using namespace std;
int const cd_row=3;
int const cd_col=10;
int const d_row=2;
int const d_col=10;
int const nn=7; // fonksiyon cagirma sayisi
int main(int argc, char *argv[])
{
int **cc,**cc1;
vector<int**> vv;
try{
cc=new int*[d_row];
cc1=new int*[d_row];
for(int i=0;i<d_row;i++){
cc[i]=new int[d_col];
cc1[i]=new int[d_col];
}
}catch(std::bad_alloc){
cout<< "Memory allocation error"<<'\n';
exit(1);
}
// Arraya kafadan deger atiyorum
for(int i=0;i<d_row;i++){
for(int j=0;j<d_col;j++){
cc[i][j]=j;
cc1[i][j]=j+10;
cout<<cc[i][j]<<"-";
}
}
cout<<'\n';
vv.push_back(cc);
vv.push_back(cc1);
cout<<vv[0][0][0]<<"\n";
cout<<vv[1][0][0]<<"\n";
for (int i=0;i<d_row;i++) delete [] cc[i];
delete cc;
system("PAUSE");
return EXIT_SUCCESS;
}
soyle bi kod yazdim. calisiyor. fakat bir dongu icinde degisen cc degerlerini ekledigim zaman vektorun icindeki onceki ekledigim cc degerleride son cc degerini aliyor. sanirim vector de adres degerlerini tutuyor...?
Pardon soru acik olmamis... sorum su:
youkaridaki yazdigim kodda su satir soyle degisirse
vv.push_back(cc);
vv.push_back(cc1);
cout<<vv[0][0][0]<<"\n";
for (int i=0;i<d_row;i++) delete [] cc1[i];
delete cc1;
cout<<vv[1][0][0]<<"\n"; /// cc1 in ilk degerine ulasilamiyor...
for (int i=0;i<d_row;i++) delete [] cc[i];
delete cc;
cc1 degerini vektore aktardiktan sonra ayirdigim bellek alanini sildikten sonra vektor un tuttugu bellegide silmis oluyorum.
vektor kendisi icin ayri bir bellek alani ayirmiyor mu?
bunu aciklayabilirmisiniz?
tesekkurler
vector kendi bellegini kendi yonetiyor.Dogru ancak senin vector'un nesnelerin kopyalarini tutmuyor,dedigin gibi nesnelere ait adresleri tutuyor.Dolayisiyla vector'un ayirdigi bellek sadece referanslari tutmak icin, isaret ettikleri yerde her ne varsa onun icin degil.
vv'nin ilk elemani icin delete kullandiginda, ilk elemanda saklanan gosterge icin ayrilan bellegi geri vermis oluyorsun. Yani vector'un icinde hala varolsa da gosterdigi yerde artik bir dizi yok gibi dusunebilirsin.Daha dogrusu gosterdigi yerdeki alan artik isteyen baska birine de verilebilir.Hatta bellegi geri vermene ragmen ordaki bilgiyi degismeden tekrar alabilme ihtimalin var ama geri verilmis alandaki bilgiye tekrar erismek ve kullanmak basina buyuk sorunlar acabilir.
Peki bu durumda, bir cok matrisi bir vektore yukleyip, sonra bunlara ulasmak istiyorum. bu matrisler dosyalardaki datalara karsilik geliyor. Her dosyadan gelecek veriler icin ayri bir dizi yada isaretci tanimlamak istemiyorum.
kisacasi matrisim deki degerleri ayni formda vektor icinde tutmak istiyorum. yukarida yazdigim sekilde olursa vector adresleri tuttugu icin, vector sadece bir matrisi tutuyormus gibi davraniyor
bu konuda bi oneriniz varmi?
tesekkurler
Aslinda basindan beri aklima gelen;acaba gercekten cc gibi bir dizi kullanmaya ihtiya var mi? Ancak tam olarak ne yapilmak istendigini bilmedigimden bisey yazamadim.
cc yi kullanmak mecburi ise farkli dizilere isaret eden gostergeleri saklaman gerekiyor veya cc den kopyalamalisin.
Eger cc gibi bir diziyi olustumaktan kacinilabiliyorsa her elemani iki boyutlu bir vector saklayan bir vector tanimlanabilir. Garip bir yapi oluyor :) Ancak sanirim karmasiklik kacinilmaz oluyor.
Asagida neyin kayitedildigini belirtecek bir key ile beraber bir de vector tutan yapilar olusturdum. Ikinci boyutu tutan vector’un her elemani firstD turunden bir yapi,yani dVecContainer'in her elemani bir key ve bir vectorden olusuyor.
main icindeki mainCont ise secondD turunden nesneler tutuyor. Ornek olarak mainCont un ilk elemani olan yapidaki vectorun ilk elemanindaki key’e deger olarak “key1” ve ve dVec in ilk elemanina 2 atadim.
Biraz karmasik gibi dursa da aslinda o kadar degil. typedef ler kullanilarak daha okunakli hale getirilebilir tabii.
struct firstD
{
vector<double> dVec;
string key;
} firstD_;
struct secondD
{
vector<firstD> dVecContainer;
string key;
} secondD_;
int main()
{
firstD_.dVec.push_back(2);
firstD_.key = "key1";
secondD_.dVecContainer.push_back(firstD_);
vector<secondD> mainCont;
mainCont.push_back(secondD_);
cout << mainCont.begin()->dVecContainer.begin()->key << endl;
cout << mainCont.begin()->dVecContainer.begin()->dVec.front() << endl;
return 0;
}
Tesekkur ederim benim aradigimda buna benzer bir yoldu... kusura bakmayin soruyu gecenin gece saatinde kafam sisimiskes sorunca toparlayamadim :)
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.