webForumDet fria alternativet

Sortering lista

C/C++ur C/C++

11 svar · 919 visningar · startad av jboy_87

Medlem sedan aug. 20011 099 inlägg
Frågan#1

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;
}
Medlem sedan juli 2002581 inlägg
#2

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.

Medlem sedan aug. 20011 099 inlägg
#3

kan du visa nått exempel?

Medlem sedan dec. 20025 483 inlägg
#4
bool operator<(const struktur& lhs, const struktur& rhs)
{
  return strncmp(lhs.namn, rhs.namn, 40) < 0;
}
Medlem sedan aug. 20011 099 inlägg
#5

det där ser komplicerad för mig! hur ser hela koden?

Medlem sedan dec. 20025 483 inlägg
#6

Inkludera <cstring> och lägg operatoröverlagringen under definitionen av struktur.

Medlem sedan aug. 20011 099 inlägg
#7

oki tack vad gör koden exakt? vad gör operatorn?.. kan man inte göra det på ett enklare sätt?

Medlem sedan dec. 20025 483 inlägg
#8

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.

Medlem sedan aug. 20011 099 inlägg
#9

vad är strncmp och vad betyder (40) < 0? kan man skriva det på enklare sätt med if sattser kanske??

Medlem sedan juli 2004181 inlägg
#10

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).

  • om strncmp returnerar 0 är båda strängarna lika
  • om strncmp returnerar < 0 så är första strängen är mindre än den andra strängen (jämförelse per tecken (unsigned char))
  • om strncmp returnerar > 0 så är andra strängen är mindre än den första (jämförelse per tecken (unsigned char))
  return strncmp(lhs.namn, rhs.namn, 40) < 0;

är samma sak som:

  if( strncmp( lhs.namn, rhs.namn, 40 ) < 0 )
    return true;

  return false;
Medlem sedan aug. 20011 099 inlägg
#11

tack för svaret!
Alltså flyttar operatorn själva struktur datan efter en insert i listan? eller hur fungerar det?

Medlem sedan juni 20008 205 inlägg
#12

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.

132 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)