Det fungerar inte för att funktionen 'sort' inte vet hur den skall jämföra två stycken 'struktur'.
Om du implementerar 'operator<' för din datastruktur kommer den gå att sortera.
11 svar · 919 visningar · startad av jboy_87
Hejsan varför funkar inte sorteringen?
#include <iostream>
#include <list>
#include <cstdlib>
#include <string>
using namespace std;
struct struktur {
char namn[40];
}; // Skapar en tom struktur
int main()
{
struktur data;
list<struktur> lista;
cin >> data.namn; // Mata in värdet i strukture
lista.push_back(data);
cin >> data.namn; // Mata in värdet i strukture
lista.push_back(data);
cin >> data.namn; // Mata in värdet i strukture
lista.push_back(data);
cin >> data.namn; // Mata in värdet i strukture
lista.push_back(data);
cout << "Original contents:\n";
list<struktur>::iterator p = lista.begin();
while(p != lista.end()) {
cout << (*p).namn << " ";
p++;
}
cout << endl << endl;
lista.sort();
cout << "Sorted contents:\n";
p = lista.begin();
while(p != lista.end()) {
cout << (*p).namn << " ";
p++;
}
getchar();
return 0;
}
Det fungerar inte för att funktionen 'sort' inte vet hur den skall jämföra två stycken 'struktur'.
Om du implementerar 'operator<' för din datastruktur kommer den gå att sortera.
kan du visa nått exempel?
bool operator<(const struktur& lhs, const struktur& rhs)
{
return strncmp(lhs.namn, rhs.namn, 40) < 0;
}
det där ser komplicerad för mig! hur ser hela koden?
Inkludera <cstring> och lägg operatoröverlagringen under definitionen av struktur.
oki tack vad gör koden exakt? vad gör operatorn?.. kan man inte göra det på ett enklare sätt?
Operatorn '<' jämför två operander och returnerar sant om den vänstra är mindre än den högra, och falskt annars. (Eftersom du själv implementerar definitionen av den behöver ju så inte vara fallet, men det skulle ju å andra sidan göra saker och ting ologiskt i stället.)
När du skriver
struktur u, v;
... // <- fyll i namn
[red]if (u < v)[/red]
står där egentligen
if (operator<(u, v))
Jag tror inte det går att göra på enklare sätt – operatoröverlagring är en av de tuffaste delarna i C++, och är något du förr eller senare bör sätta tänderna i om du avser fortsätta med språket.
Annars har du ju C bara runt hörnet.
vad är strncmp och vad betyder (40) < 0? kan man skriva det på enklare sätt med if sattser kanske??
jboy_87 skrev:
vad är strncmp och vad betyder (40) < 0? kan man skriva det på enklare sätt med if sattser kanske??
Linux Man Page: http://www.die.net/doc/linux/man/man3/strncmp.3.html
D.v.s. strängjämförelse mellan två strängar, dock max 40 tecken (mindre om någon av strängarna är kortare än 40 tecken).
return strncmp(lhs.namn, rhs.namn, 40) < 0;
är samma sak som:
if( strncmp( lhs.namn, rhs.namn, 40 ) < 0 )
return true;
return false;
tack för svaret!
Alltså flyttar operatorn själva struktur datan efter en insert i listan? eller hur fungerar det?
Nej, operator<(const struktur &, const struktur &) gör bara så att du kan använda < för att testa om ett objekt av typen struktur är mindre än ett annat objekt av samma typ. Detta råkar vara precis vad sort() gör när den flyttar runt element i en vector<struktur>. Utan operatoröverlagringen vet inte sort hur den ska jämföra två objekt av typen "struktur", vilket ger dig kompileringsfel.