Just nu i M3-nätverket
Jump to content

Ta bort element ur lista


WinniePooh

Recommended Posts

Jag ska skapa en lista med namn...

har lyckat få det att fungera så långt att jag kan lägga in nytt namn samt visa listan med namn!

Nu vill jag kunna TA BORT namn ur listan oxå!

 

Finns det NÅGON som kan hjälpa mig med detta!?!

Vore kanon!

 

Här är koden:

 

class namnet

{

private:

string namn;

 

public:

namnet(){}

namnet(string n):namn(n){}

 

string visa_namn() const {return namn;}

void skrivUt();

void taBort();

bool operator<(namnet const &na) const;

};

 

void namnet::skrivUt()

{

cout<< "Namn:" << namn << endl;

 

}

 

//operatorn< måste överlagras

//den vänstra operanden är det aktuella objektet. parametern b refererar till den högra operanden och eftersom den inte ska ändras så har vi en referens till en konstant.

bool namnet::operator < (namnet const &na) const

{

return visa_namn() < na.visa_namn();

}

 

void skrivUtNamn(list<namnet> na) //stegar igenom listan med en iterator som ökar för varje varv tills den når end.

{

for (list<namnet>::iterator it=na.begin();it!=na.end();it++)

{

it->skrivUt(); //iteratorn pekar på skrivut funktionen som ska skriva ut listan

cout << endl;

}

}

 

void taBortNamn(namnet *pn)

{

pn->bak->fram = pn->fram;

pn->fram->bak = pn->bak;

delete pn;

}

 

 

int main()

{

int val=0;

string namn;

list<namnet>namnen; //skapar en list

namnet na;

while (val!=3)

{

cout << "Namnlista" << endl;

cout << "==========" << endl;

cout << "1. Lägg till namn" << endl;

cout << "2. Skriv ut listan" << endl;

cout << "3. Ta bort namn"

cout << "0. Avsluta program" << endl;

cout << " Ange val" << endl;

cin >> val;

cin.ignore();

 

if (val==1)

{

cout<< "Ange ett namn att sätta in:" ;

getline(cin, namn);

 

namnet na(namn); //sparar värderna

namnen.push_back(na); //lägger in värden i bocker som är vår list

}

if (val==2)

{

if (!namnen.empty()) //om listan inte är tom ska böckerna sorteras och sedan skrivas ut

{

namnen.sort();

skrivUtNamn(namnen);

}

else

{

cout<< " Det finns inga namn i listan!"<<endl;

}

}

if (val==3)

{

cout << "Ange det namn du vill ta bort: ";

getline.(cin, namn)

taBortNamn(namnen)

}

}

 

return 0;

}

 

Link to comment
Share on other sites

jerker olofsson

1) Lägg till assignment och copy constructor:

// Copy ctor

namnet::namnet( const namnet& rhs ) : namn( rhs.namn )

{

}

 

// Assignment

const namnet& namnet::operator = ( const namnet& rhs )

{

this.namn = rhs.namn;

return *this;

}

 

STL containers kräver dessa. Default så kommer kompilatorn att generera dessa.

 

std::list innehåller ingen funktion för att ta bort ett element genom att skicka med ett identiskt element, dvs med hjälv av operator < eller ==.

 

Detta för att det är en långsam funktion att göra iom designen på std::list. Den måste söka igenom hela listan linjert.. Jag skulle rekomendera dig till att använda en std::set om du inte behöver ha alla namn i ordning.

 

Annars får du göra en funktion själv.

 

void removeName(list<namnet>& na, std::string& n)

{

for (list<namnet>::iterator it=na.begin();it!=na.end();++it)

{

// Jämför objektet som iteratorn pekar på mot strängen n

if( *it == n ) {

// Om operatorn returnerar true så tas elementet bort och loopen slutar.

na.remove( it );

break;

}

}

}

 

Du måste också implementera en == operator som jämför ett namnet objekt mot en string.

 

bool namnet::operator == ( const string& rhs ) {

return this.namn == rhs;

}

 

Observera att du måste ha med &-tecknet i remove-funktionen. Annars kommer den att skicka en kopia på din lista till funktionen, ta bort namnet ur kopian på listan och sedan kommer den listan att slängas.

 

Link to comment
Share on other sites

TACK så mycket!!

Nu kan jag NÄSTAN köra det...

 

Klagar på nått litet i bool namnet::operator...säger att den saknar en parentes och pekar på den raden...

 

Skickar koden igen så kanske du kan se vad jag skrivit fel...

 

Vet inte heller riktigt hur jag ska anropa funktionen från min meny i main... :-( Känns som att det står helt stilla nu när man suttit med det så mycket! Hjärnsläpp totalt!!

 

Bahöll kommentarerna så det syns var det nya ligger

 

Är väldigt tacksam för er hjälp!

 

 

 

class namnet

{

private:

string namn;

 

public:

namnet(){}

namnet(string n):namn(n){}

 

string visa_namn() const {return namn;}

void skrivUt();

void remove();

bool operator<(namnet const &na) const;

};

 

void namnet::skrivUt()

{

cout<< "Namn:" << namn << endl;

 

}

 

void namnet::remove()

{

cout << "Ange namn att ta bort: ";

}

 

 

bool namnet::operator < (namnet const &na) const

{

return visa_namn() < na.visa_namn();

}

 

void skrivUtNamn(list<namnet> na) .

{

for (list<namnet>::iterator it=na.begin();it!=na.end();it++)

{

it->skrivUt();

cout << endl;

}

}

 

bool namnet::operator == (namnet const string& rhs)

{

return this.namn == rhs;

}

 

void removeName(list<namnet>& na, std::string& n)

{

for (list<namnet>::iterator it=na.begin();it!=na.end();++it)

{

// Jämför objektet som iteratorn pekar på mot strängen n

if( *it == n )

{

// Om operatorn returnerar true så tas elementet bort och loopen slutar.

na.remove( it );

break;

}

}

}

 

 

int main()

{

int val=0;

string namn;

list<namnet>namnen; //skapar en list

namnet na;

while (val!=3)

{

cout << "Namnlista" << endl;

cout << "==========" << endl;

cout << "1. Lägg till namn" << endl;

cout << "2. Skriv ut listan" << endl;

cout << "3. Ta bort namn" << endl;

cout << "0. Avsluta program" << endl;

cout << " Ange val" << endl;

cin >> val;

cin.ignore();

 

if (val==1)

{

cout<< "Ange ett namn att sätta in:" ;

getline(cin, namn);

 

namnet na(namn);

namnen.push_back(na);

}

if (val==2)

{

if (!namnen.empty()) {

namnen.sort();

skrivUtNamn(namnen);

}

else

{

cout<< " Det finns inga namn i listan!"<<endl;

}

}

 

}

 

return 0;

}

 

[inlägget ändrat 2005-01-16 08:25:02 av WinniePooh]

[inlägget ändrat 2005-01-16 11:43:03 av WinniePooh]

Link to comment
Share on other sites

jerker olofsson

operator < skall returnera en int, inte en bool. Det är nog det som är felet.. Prova att byta ut:

bool namnet::operator < (namnet const &na) const

mot

int namnet::operator < (namnet const &na) const

så borde det fungera.

 

removeName() skall du anropa med din lista ( namnen ) och strängen som användaren väljer att ta bort, dvs:

if (val==3)

{

// Användaren får mata in en sträng till detta objekt

std::string removename;

 

// Skriv ut information till användaren och få honom att mata in en sträng.

cout<< "Ange ett namn att ta bort:" ;

getline(cin, removenamn);

 

// Denna funktion kommer att söka igenom listan namnen efter ett namnet-objekt som innehåller string-objektet namn som motsvarar removenamn.

removeName( namnen, removenamn );

}

 

Just nu så är det, i min mening, onödigt krångligt iom att det är så många saker med "namn" i sig. strängar, objekt, listor osv..

Prova byta namn på klassen till t ex User. Byt namn på namnen till userList eller liknande.

 

En bra regel när man programmerar är att ha olika case på första bokstaven om det gäller ett objekt eller en klass osv.. Medlemmar kan man också ge annorlunda namn för att göra det enklare.

Exempel kan var att klasser och typer börjar med en stor bokstav, t ex:

class User;

medans en instans av en klass börjar med liten bokstav:

User user;

 

Några olika metoder för att namnge medlemsvariabler är att prefixa eller suffixa dem.

Exempelvis:

class User {

string namn_;

};

eller

class User {

string m_namn;

};

 

Observera bara att du inte är "tillåten" av C++ standarden att namnge variabler med underscore i början, exempel:

int _Integer;

 

Lycka till!

 

[inlägget ändrat 2005-01-16 18:49:47 av jerker olofsson]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...