Toon posts:

[C++] map<>

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een klein projectje waar ik mee bezig ben, moet ik woorden uit een file.txt halen en in een nieuwe stoppen. Aangezien woorden meestal meer dan 1 keer voorkomen in een tekst bestandje en de woorden mogen maar 1 keer voorkomen in de nieuwe file. Moet ik iets verzinnen waardoor er gekeken wordt of het woord al niet voor komt.
Dit wou ik doen met behulp van een linked list. Eerst de woorden uit een bron bestand halen kijken of ze nog niet voorkomen in de linked list en er bij zetten als het er nog niet instond. Als alle woorden uit de bron zijn gehaald dan de woorden uit de linked list halen en in de doel file zetten.
Nou ben ik er op gewezen dat je er ook iets was van een map <>. Nou heb ik gezocht in de help van mijn compiler en op internet. Kon niks nuttigs er over vinden. Weet iemand hier iets misschien over ?

Verwijderd

code:
1
2
3
4
5
struct woorden
{
   char woord[100];
   woorden *pointer;
}

en dan die pointer gebruiken om door te linken naar de volgende.

Verwijderd

Hier nog een voorbeeldje :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream.h>

typedef struct item {
   int val;
   item * next;
} item;

int main() {
   item * head = NULL;
   int i;
   for(i=1;i<=10;i++) {
    item * curr = new item;
    curr->val = i;
    curr->next  = head;
    head = curr;
   }
   while(head) {
    cout << head->val << " ";
    head = head->next ;
   }
   return 0;
}

Verwijderd

Als je echt geinteresseerd bent in het toepassen van C++ standard library containers (zoals std::map), zou je kunnen overwegen een boek (ja zo'n ding met papier 8-)) over C++ of specifiek C++ STL te kopen.

Bruce Eckel heeft trouwens ook wat gratis C++ boeken op z'n site, ik heb gehoord dat die wel aardig zijn (ook al vind ik zijn Java boek niet echt alles).

Verwijderd

Om je toch maar uit de brand te helpen :) Je hebt geen map nodig maar een set. Verder hoef je alleen STL algoritmes en iterators te gebruiken om dit voor elkaar te krijgen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <set>
#include <iterator>
#include <algorithm>

int main() {
  std::set<std::string> woorden;  // set van unieke woorden

  // lees de set in van de standaard input
  std::copy(std::istream_iterator<std::string>(std::cin),
        std::istream_iterator<std::string>(),
        std::inserter(woorden, woorden.begin()));

  // lege regel
  std::cout << std::endl;

  // druk de unieke woorden af naar de standaard output 
  std::copy(woorden.begin(), woorden.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));

  // en klaar
  return 0;
}

<edit>
Er is trouwens genoeg infromatie over de STL online; Mumit Khan's (van mingw32) STL newbie guide is een prima startpunt, SGI's STL programmers guide is goed en vrijwel compleet. Verder vind je op google genoeg online tutorials.
</edit>

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op vrijdag 16 november 2001 16:11 schreef mietje het volgende:
code:
1
stuk code
Verbaas me er altijd over hoe jij altijd std:: blijft gebruiken ipv een use namespace, maar waarschijnlijk heb je al een handige toetsen-combinatie hiervoor uitgevonden :Y)
beetje offtopic .. maar valt me altijd gewoon op (ik doe het dus alleen in headers)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
Op vrijdag 16 november 2001 17:33 schreef Orphix het volgende:
Verbaas me er altijd over hoe jij altijd std:: blijft gebruiken ipv een use namespace,
Ik vind het in dit geval vrij onleesbaar worden eigenlijk...

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Het expliciet declareren van de namespace vindt ik zelf veel beter, omdat je dan preciezer aangeeft wat je gebruikt. Als je using std; dan krijg je eerder conflicten. Dit omdat de namen gebruikt in het standaard namespace vaak erg algemeen zijn. List Vector String. Allemaal algemene aanduidingen die kunnen conflicteren met eigen implementaties.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Tja _als_ ik al een verbeterde vector wil maken, dan zal ik die zeker weten anders gaan noemen dan (std::)vector. En als ik er al 1 zal maken met dezelfde naam dan gebruik ik die in een andere namespace en gebruik ik die wel expliciet. Dan zien je mede programmeurs in ieder geval dat ze niet met de standaard vector te maken hebben. Gewoon vector<int> gebruiken duidt op de STL. punt.

Verwijderd

Op vrijdag 16 november 2001 17:33 schreef Orphix het volgende:
Verbaas me er altijd over hoe jij altijd std:: blijft gebruiken ipv een use namespace, maar waarschijnlijk heb je al een handige toetsen-combinatie hiervoor uitgevonden :Y)
De reden is simpel, ik wil onderscheid maken tussen de standard en de global namespace. Als ik mijn eigen code in de global namespace plaats krijg ik nooit conflicten met de standard namespace, nu niet en in de toekomst ook niet.

(En ik vind het gebruik van i/o iterators in principe veel onleesbaarder dan wat std:: in je code ;))

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 23:59
Op vrijdag 16 november 2001 20:53 schreef mietje het volgende:

(En ik vind het gebruik van i/o iterators in principe veel onleesbaarder dan wat std:: in je code ;))
Ook weer waar; die typecursus van de middelbare school betaalt zichzelf zo toch weer terug :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1