Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

1

02.07.2009, 17:34

std::vector zu array

Ich schäme mich irgendwie grade diese Frage zu stellen, aber ich scheine ein Blackout zu haben ^^
Wie übertrage ich den Inhalt eines std::vector in ein normales array? Egal was ich grade versuche, gcc beschwert sich ^^

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

2

02.07.2009, 17:49

Wozu ist das nütze? Einen Vektor kannst du doch auch wie ein Array nutzen.

C-/C++-Quelltext

1
2
3
4
for(int i = 0; i <= vector.size(); i++)
{
   array[i] = vector[i];
}

Vom Prinzip her so ungefähr ;)

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

3

02.07.2009, 17:55

Wenn du nur temporär so tun willst als wär es ein Array und dabei der Vector sicher gültig bleibt:

C-/C++-Quelltext

1
2
std::vector<int> vec(10);
int *vec_array = &vec[0];

Ansonsten halt richtig kopieren...

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

4

02.07.2009, 18:01

Zitat von »"Fred"«


C-/C++-Quelltext

1
2
3
4
for(int i = 0; i <= vector.size(); i++)
{
   array[i] = vector[i];
}



Liegen die Daten bei dem Vektor linear im speicher, oder sind die verteilt? bei grek40s variante müsste das ja dann eigentlich an einem stück sein, oder?
und du hast grade den interessanten teil weggelassen, nämlich das deklarieren des arrays ^^
Typ array[vector.size()]; lässt er mich nämlich nicht machen, wegen variabler größe... und wenn ich einfach Typ array[1000]; mache, beschwert er sich, weil Typ keinen standartkonstruktor hat, der keine parameter nimmt... wie bring ich dem das bei ^^

5

02.07.2009, 18:08

Zitat

Typ array[vector.size()]; lässt er mich nämlich nicht machen, wegen variabler größe

C-/C++-Quelltext

1
2
3
4
5
int* array = new int[vector.size()];

// Code


delete[] array;

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

6

02.07.2009, 18:17

ok, darauf hätte ich auch echt selbst kommen können ^^
Und jetzt noch bitte ein beispiel, wie ich dem noch ein paar parameter übergeben kann...
type* array = new type(1,2,3)[vector.size()];
type* array = new type[vector.size()](1,2,3);
mag er beides nicht ^^

7

02.07.2009, 19:30

Zitat von »"Fred"«

C-/C++-Quelltext

1
2
3
4
for(int i = 0; i <= vector.size(); i++) 
{ 
   array[i] = vector[i]; 
} 

Warum nicht so? ;)

C-/C++-Quelltext

1
std::copy(vector.begin(), vector.end(), array);


Zitat von »"n0_0ne"«

Liegen die Daten bei dem Vektor linear im speicher
Ja.

Zitat von »"n0_0ne"«

Typ array[vector.size()]; lässt er mich nämlich nicht machen, wegen variabler größe... und wenn ich einfach Typ array[1000]; mache, beschwert er sich, weil Typ keinen standartkonstruktor hat, der keine parameter nimmt... wie bring ich dem das bei ^^
Das ist nicht möglich. Aber es ist eigentlich recht sinnlos, ein statisches Array zu erstellen, um die std::vector-Daten da reinzukopieren. Auch sich die Speicherverwaltung wieder selbst aufbürden, indem man mit new[] und delete[] arbeitet, ist ein wenig fragwürdig.

Was willst du damit erreichen?

Zitat von »"n0_0ne"«

Und jetzt noch bitte ein beispiel, wie ich dem noch ein paar parameter übergeben kann...
Ebenfalls nicht möglich. Für std::vector gäbe es einen Initialisierungslisten-Workaround (Boost.Assign).

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

8

02.07.2009, 19:55

warum willst das das machen?

du kannst ein vector genauso wie ein array behandeln
(außer vllt bei templates aka <T[N], size_t N>).

auch alle STL funktionen akzeptieren beides.

mit

C-/C++-Quelltext

1
&vec[0]


bekommst du einen zeiger auf die internen daten, die (glaube sogar vom
standard vorgeschrieben) linear im speicher liegen. solange der vektor
nicht wächst oder gelöscht wird, ist der zeiger gültig.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

9

02.07.2009, 19:55

Achso, das geht garnicht... frage ich mich warum ^^
Und dass es keinen sinn macht, habe ich jetzt auch kapiert, ich hatte im Hinterkopf irgendwie die funktionsweise von doppeltverketteten listen, brauchte die daten aber an einem stück ^^
Hat sich also erledigt, danke für die Erläuterungen :)

10

02.07.2009, 23:04

Zitat von »"n0_0ne"«

Achso, das geht garnicht... frage ich mich warum ^^
Weil C++ es eben nicht erlaubt. Im nächsten Standard kommen allerdings initializer_lists.

Zitat von »"n0_0ne"«

Und dass es keinen sinn macht, habe ich jetzt auch kapiert, ich hatte im Hinterkopf irgendwie die funktionsweise von doppeltverketteten listen, brauchte die daten aber an einem stück ^^
Das, was du meinst, wäre dann wohl std::list. ;)

Werbeanzeige