[c++] String array in realtime vergroten

Pagina: 1
Acties:

  • scaver
  • Registratie: September 2001
  • Laatst online: 28-08 14:48
Hoi ik heb een klein probleempje.
Ik heb alwat gevonden, maar het past niet helemaal.
Ik heb een array waarin allemaal Strings komen te staan. Nu wil ik deze array in realtime kunnen vergroten.

Nu heb ik deze code gevonden
long Amount = 10;
long *Blaat = new long[Amount];
// vul array
long *Temp = new long[Amount + 1];
if( Blaat)
{
memcpy( Temp, Blaat, Amount); // copy old array
delete[] Blaat;
}
Blaat = Temp;

Maar deze is voor een long..
Ik heb al vanalles geprobeerd om 'm om te zetten.
Ik zal wel iets over het hoofd zien.
Wie kan 'm overzetten zodat ik een String array kan gebruiken?
Tnx

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Een string array is normaal gezegd een char*.

Maar waarom gebruik je string gewoon niet?
code:
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
using namespace std;

int main() {
  string a = "bob";
  string b = "jan";
  a = a + b;
  return 0;
}


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

ehm...

al naar malloc gekeken? :?

  • DolleDries
  • Registratie: Oktober 2000
  • Laatst online: 22-08 11:46
Moet het perse een array zijn ?
Waarom maak je er geen linked list van ?
Die kan je dynamisch zo groot maken als je zelf maar wilt..

just my 2 cents (ja eurocents :P)

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Ten eerste. Ik ga niets voor je doen. Tips kun je krijgen, maar werken doe je zelf maar ;)

1) Meer informatie. Wat gaat er fout?
2) Ken je pointers?
3) Scriptrequests mogen niet
4) Wat heb je allemaal geprobeerd

Hmmzjah, deze code ziet er btw niet echt effectief uit. Enne is Vector<string> niets voor je? Die datastructuur bestaat al en doet precies wat je wil (en waarsch. beter dan dat jij kan proggen imho)

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 19 april 2002 10:31 schreef DolleDries het volgende:
Moet het perse een array zijn ?
Waarom maak je er geen linked list van ?
Die kan je dynamisch zo groot maken als je zelf maar wilt..

just my 2 cents (ja eurocents :P)
Effectiviteit van een linked list is laag, behalve als je veel wilt toevoegen aan plaatsen die niet het einde van de rij zijn :)

Een dynamische array door middel van pointers kan je ook zo groot maken als je wilt.

  • scaver
  • Registratie: September 2001
  • Laatst online: 28-08 14:48
Op vrijdag 19 april 2002 10:32 schreef Glimi het volgende:
Ten eerste. Ik ga niets voor je doen. Tips kun je krijgen, maar werken doe je zelf maar ;)
hehe..

Nee, het punt is dat ik een file wil inlezen.
Elke regel moet als string in een array komen te staan.
Op deze array worden wat filter op los gelaten zodat ik alleen de gewenste data overhou.

Alleen het punt is. Ik weet niet hoe groot de file is..

<helder moment>
Kan ik niet op een makkelijke manier achter het aantal regels komen van een file?
</helder moment>

Verwijderd

Op vrijdag 19 april 2002 10:41 schreef scaver het volgende:

[..]

hehe..

Nee, het punt is dat ik een file wil inlezen.
Elke regel moet als string in een array komen te staan.
Op deze array worden wat filter op los gelaten zodat ik alleen de gewenste data overhou.

Alleen het punt is. Ik weet niet hoe groot de file is..

<helder moment>
Kan ik niet op een makkelijke manier achter het aantal regels komen van een file?
</helder moment>
Dat voorbeeld wat je gaf is hiervoor heel inefficient want bij elke regel die je toevoegd als de array vol is kopieer je de hele array weer. Ik zou dus ook gewoon een vector<string> gebruiken die ruimte voor bijv 100 regels reserveerd.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 19 april 2002 10:52 schreef xerix het volgende:

[..]

Dat voorbeeld wat je gaf is hiervoor heel inefficient want bij elke regel die je toevoegd als de array vol is kopieer je de hele array weer. Ik zou dus ook gewoon een vector<string> gebruiken die ruimte voor bijv 100 regels reserveerd.
[onnuttige kennis mode]
Vector begint op 0. Dan naar 256 en dan telkens *2 (dus volgende vergroting is 512, 1024, 2048 enz.)
[/onnuttige kennis mode]

  • The End
  • Registratie: Maart 2000
  • Laatst online: 06:48

The End

!Beginning

Als je niet longs gebruikt maar DWORDs, dan heb je pointers :) Dan hoef je alleen maar de pointers te copieren... Dat scheelt al een heel stuk.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
Op vrijdag 19 april 2002 11:05 schreef Glimi het volgende:

[..]

[onnuttige kennis mode]
Vector begint op 0. Dan naar 256 en dan telkens *2 (dus volgende vergroting is 512, 1024, 2048 enz.)
[/onnuttige kennis mode]
s/onnuttig/onjuist/
vector begint waar het begint. Wat het vervolgens doet hangt af van de implementatie, en of je reserve() aanroept.
Op een empty vector reserve(100) aanroepen reserveert dus waarschijnlijk ruimte voor 100 elementen.

Die factor twee is in oude implementaties gebruikt, maar uit profiling bleek dat 150% beter is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 19 april 2002 11:23 schreef MSalters het volgende:

[..]

s/onnuttig/onjuist/
vector begint waar het begint. Wat het vervolgens doet hangt af van de implementatie, en of je reserve() aanroept.
Op een empty vector reserve(100) aanroepen reserveert dus waarschijnlijk ruimte voor 100 elementen.

Die factor twee is in oude implementaties gebruikt, maar uit profiling bleek dat 150% beter is.
Owkay ;) Blij dat ik verouderde kennis te leren krijg op school :(

Maar er van uitgaande dat Vector met de default constructor geïnitialiseerd wordt, dan begint ie wel op 0

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
Op vrijdag 19 april 2002 11:31 schreef Glimi het volgende:

[..]

Owkay ;) Blij dat ik verouderde kennis te leren krijg op school :(

Maar er van uitgaande dat Vector met de default constructor geïnitialiseerd wordt, dan begint ie wel op 0
std::vector<T> heeft eigenlijk twee sizes, een die je met resize() beinvloedt, en push_back etc, en de ander die je met reserve kunt beinvloeden. De eerste geeft het aantal T's aan, en het verschil tussen de size() en de reserve()d is het aantal T's wat je tenminste nog kunt alloceren zonder dat je een reallocatie krijgt. De laatste wordt typisch met een constante factor verhoogd (150% of 200%) als je het zelf niet doet.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • scaver
  • Registratie: September 2001
  • Laatst online: 28-08 14:48
Nu ben ik bezig met vectoren..

vector<string> allwords;
//knip buff is een String
allwords.push_back(buff);
//knip
const char *LijstCharX = allwords[x+2].c_str(); //string naar char omzetten

LijstIntX= atoi(LijstCharX); //char naar int omzetten
------------------------
En deze int heb ik nodig om een coordinaat te tekenen.
Maar nu klopt de waarde van de invoer string (buff) met de uitvoer int (LijstIntX)
Enig idee wat fout is?

  • scaver
  • Registratie: September 2001
  • Laatst online: 28-08 14:48
hehe.. deed het wel.. alleen het einde van de vector stond verkeerd... |:(

Verwijderd

arrays vergroten in C/C++ in realtime kan met realloc()

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op woensdag 24 april 2002 16:06 schreef beelzebubu het volgende:
arrays vergroten in C/C++ in realtime kan met realloc()
Ik was al bang dat niemand het zou noemen.
Op vrijdag 19 april 2002 10:41 schreef scaver het volgende:
Alleen het punt is. Ik weet niet hoe groot de file is..
Waarom zou je dat niet weten? :?
<helder moment>
Kan ik niet op een makkelijke manier achter het aantal regels komen van een file?
</helder moment>
Niet zonder het hele bestand in te lezen. Hangt er dus een beetje vanaf wat je 'makkelijk' noemt.

Als je toch C++ aan 't coden bent, kun je net zo goed string-objecten gebruiken. Dan kun je eventuele slechte prestaties mooi op je STL afschuiven.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
Op woensdag 24 april 2002 16:13 schreef Soultaker het volgende:

[arrays vergroten in C/C++ in realtime kan met realloc()]

Ik was al bang dat niemand het zou noemen.
[..]
Ik was al bang dat iemand het wel zou noemen. realloc werkt niet echt samen met std::string.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op woensdag 24 april 2002 18:11 schreef MSalters het volgende:
Ik was al bang dat iemand het wel zou noemen. realloc werkt niet echt samen met std::string.
Maar uit de topic bleek dat het om een 'string array' ging, wat ik dan maar heb opgevat als een array van characters. Dat bleek ook al uit de verhalen over realloc en memcpy (die OOK niet samengaan met string objecten).

Maar het goede antwoord zou dus zijn: gebruik een string of een rope van chars (persoonlijk denk ik dat 'n rope hier geen voordelen biedt) en vraag dan op het eind gewoon de (char*) naar de data op. Maar dat had ik al gezegd, geloof ik.
Pagina: 1