acehreli
04/07/2008, 18:15
Bir arkadas bana soyle bir soru sordu:
Asagidaki programin ciktisina bakarsak, vec.erase(it) yapildigi halde o erisicinin gosterdigi nesne sonlanmiyor? Neden cikista "2. Adama Silindi" yazisi tam sondan ikinci for dOngUsunde vec.erase(it) yapildigi anda olmuyor?
Kod soyle:
#include <boost/smart_ptr.hpp>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Adam{
private:
string Adi;
public:
int No;
Adam(){
cout << "Adam Olustu" << endl;
};
~Adam(){
cout << No << ". Adam Silindi" << endl;
};
void SetAdam(int vNo,string isim){
No = vNo;
Adi = isim;
Yaz();
};
void Yaz(){
cout << "Isim =" << Adi << endl;
cout << "No =" << No << endl;
};
void Soyle(){
cout << No << " numarali adamim. Adim =" << Adi << endl;
};
};
int main()
{
typedef boost::shared_ptr<Adam> CAdamPtr;
std::vector<CAdamPtr> vec;
CAdamPtr A1=CAdamPtr(new Adam);
A1->SetAdam(1,"fatih");
CAdamPtr A2=CAdamPtr(new Adam);
A2->SetAdam(2,"fatma");
CAdamPtr A3=CAdamPtr(new Adam);
A3->SetAdam(3,"sehide");
vec.push_back(A1);
vec.push_back(A2);
vec.push_back(A3);
cout << "Boyut =" << vec.size() << endl <<endl;
A2->SetAdam(2,"yeni isim");
cout << "Boyut =" << vec.size() << endl <<endl;
A1->Soyle();
A2->Soyle();
A3->Soyle();
std::vector<CAdamPtr>::iterator it;
for ( it=vec.begin() ; it < vec.end(); it++ ){
CAdamPtr temp;
temp = *it;
if (temp->No==2){
vec.erase(it);
break;
};
};
cout << "Boyut =" << vec.size() << endl <<endl;
for ( it=vec.begin() ; it < vec.end(); it++ ){
CAdamPtr temp;
temp = *it;
temp->Soyle();
};
cout << "Boyut =" << vec.size() << endl <<endl;
return 0;
}
Cikisin son satirlari soyle oluyor (yerini anlamadigimiz satiri isaretledim):
...
1 numarali adamim. Adim =fatih
2 numarali adamim. Adim =yeni isim
3 numarali adamim. Adim =sehide
Boyut =2
1 numarali adamim. Adim =fatih
3 numarali adamim. Adim =sehide
Boyut =2
2. Adam Silindi
1. Adam Silindi
3. Adam Silindi
Ama ciktinin son satirlarinin soyle olacagini dusunurduk:
...
1 numarali adamim. Adim =fatih
2 numarali adamim. Adim =yeni isim
3 numarali adamim. Adim =sehide
2. Adam Silindi
Boyut =2
1 numarali adamim. Adim =fatih
3 numarali adamim. Adim =sehide
Boyut =2
1. Adam Silindi
3. Adam Silindi
Belki baskalarinin da ilgisini ceker diye buraya da yazdim. Neden vec.erase(it) yapildiginda silinmiyor? :)
Ali
Asagidaki programin ciktisina bakarsak, vec.erase(it) yapildigi halde o erisicinin gosterdigi nesne sonlanmiyor? Neden cikista "2. Adama Silindi" yazisi tam sondan ikinci for dOngUsunde vec.erase(it) yapildigi anda olmuyor?
Kod soyle:
#include <boost/smart_ptr.hpp>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Adam{
private:
string Adi;
public:
int No;
Adam(){
cout << "Adam Olustu" << endl;
};
~Adam(){
cout << No << ". Adam Silindi" << endl;
};
void SetAdam(int vNo,string isim){
No = vNo;
Adi = isim;
Yaz();
};
void Yaz(){
cout << "Isim =" << Adi << endl;
cout << "No =" << No << endl;
};
void Soyle(){
cout << No << " numarali adamim. Adim =" << Adi << endl;
};
};
int main()
{
typedef boost::shared_ptr<Adam> CAdamPtr;
std::vector<CAdamPtr> vec;
CAdamPtr A1=CAdamPtr(new Adam);
A1->SetAdam(1,"fatih");
CAdamPtr A2=CAdamPtr(new Adam);
A2->SetAdam(2,"fatma");
CAdamPtr A3=CAdamPtr(new Adam);
A3->SetAdam(3,"sehide");
vec.push_back(A1);
vec.push_back(A2);
vec.push_back(A3);
cout << "Boyut =" << vec.size() << endl <<endl;
A2->SetAdam(2,"yeni isim");
cout << "Boyut =" << vec.size() << endl <<endl;
A1->Soyle();
A2->Soyle();
A3->Soyle();
std::vector<CAdamPtr>::iterator it;
for ( it=vec.begin() ; it < vec.end(); it++ ){
CAdamPtr temp;
temp = *it;
if (temp->No==2){
vec.erase(it);
break;
};
};
cout << "Boyut =" << vec.size() << endl <<endl;
for ( it=vec.begin() ; it < vec.end(); it++ ){
CAdamPtr temp;
temp = *it;
temp->Soyle();
};
cout << "Boyut =" << vec.size() << endl <<endl;
return 0;
}
Cikisin son satirlari soyle oluyor (yerini anlamadigimiz satiri isaretledim):
...
1 numarali adamim. Adim =fatih
2 numarali adamim. Adim =yeni isim
3 numarali adamim. Adim =sehide
Boyut =2
1 numarali adamim. Adim =fatih
3 numarali adamim. Adim =sehide
Boyut =2
2. Adam Silindi
1. Adam Silindi
3. Adam Silindi
Ama ciktinin son satirlarinin soyle olacagini dusunurduk:
...
1 numarali adamim. Adim =fatih
2 numarali adamim. Adim =yeni isim
3 numarali adamim. Adim =sehide
2. Adam Silindi
Boyut =2
1 numarali adamim. Adim =fatih
3 numarali adamim. Adim =sehide
Boyut =2
1. Adam Silindi
3. Adam Silindi
Belki baskalarinin da ilgisini ceker diye buraya da yazdim. Neden vec.erase(it) yapildiginda silinmiyor? :)
Ali