---
title: "Sortering lista"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/156469-sortering-lista"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "jboy_87"
published: "2007-01-27T13:41:44.000Z"
updated: "2007-02-13T15:23:37.000Z"
replies: 11
views: 934
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/156469-sortering-lista"
---

# Sortering lista

## #1 — jboy_87, 2007-01-27T13:41Z

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;
}
```

Permalänk: https://www.webforum.nu/p/156469

## #2 — Sang-drax, 2007-01-29T00:18Z

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.

Permalänk: https://www.webforum.nu/p/1927450

## #3 — jboy_87, 2007-01-29T16:49Z

kan du visa nått exempel?

Permalänk: https://www.webforum.nu/p/1927628

## #4 — Peter S, 2007-01-29T17:23Z

```
bool operator<(const struktur& lhs, const struktur& rhs)
{
  return strncmp(lhs.namn, rhs.namn, 40) < 0;
}
```

Permalänk: https://www.webforum.nu/p/1927637

## #5 — jboy_87, 2007-01-30T01:38Z

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

Permalänk: https://www.webforum.nu/p/1927794

## #6 — Peter S, 2007-01-30T10:50Z

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

Permalänk: https://www.webforum.nu/p/1927885

## #7 — jboy_87, 2007-01-30T14:19Z

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

Permalänk: https://www.webforum.nu/p/1927946

## #8 — Peter S, 2007-01-30T14:43Z

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.

Permalänk: https://www.webforum.nu/p/1927955

## #9 — jboy_87, 2007-02-04T16:07Z

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

Permalänk: https://www.webforum.nu/p/1932385

## #10 — luna, 2007-02-04T17:29Z

> **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;
```

Permalänk: https://www.webforum.nu/p/1932406

## #11 — jboy_87, 2007-02-13T15:12Z

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

Permalänk: https://www.webforum.nu/p/1934756

## #12 — spango, 2007-02-13T15:23Z

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.

Permalänk: https://www.webforum.nu/p/1934757

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/156469-sortering-lista
