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

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

16.04.2009, 13:44

std::vector to array[]

Hi, kleine frage wie kann ich ein vector Object in ein normalen c array convertieren.(und umgekert)
Find einfach die funktion dafür nicht. :roll:

2

16.04.2009, 13:53

std::copy(vec.begin(), vec.end(), array);

3

16.04.2009, 14:28

Wenn du ein Read Only Array hast (weil du es an eine C Funktion übergeben willst) kannst du einfach den Pointer auf das erste Element nehmen, es ist garantiert, dass die Elemente dort genauso angeordnet sind wie in einem C Array.
Verändern kannst du einzelne Elemente, aber die Größe ändern nicht (weil dafür der Zeiger ja eine neue Adresse mit new zugewiesen bekommen müsste).
Lieber dumm fragen, als dumm bleiben!

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

4

16.04.2009, 17:16

C-/C++-Quelltext

1
2
3
std::copy(vec.begin(), vec.end(), array); // vec > array


std::copy(array, array+size, vec.begin()); //arr -> vec


So hab ich es verstanden

5

16.04.2009, 17:33

Zitat von »"kiba"«

So hab ich es verstanden

genau, musst natürlich aufpassen, das das Array auch so groß wie der vektor ist, sonst gibts speicherfehler

@Jona: es ginge glaub nicht darum, wie man einen vektor verwendet, wo man ein C-Array bräuchte, sondern wie man zwischen einem C-Array und einem Vektor hin- und herkonvertiert ;)

klar kann man den Zeiger aufs erste element verwenden, wenn ein C-Array verlangt wird, aber was ist, wenn du schon ein C-Array HAST zu dem/von dem du konvertieren willst.

6

16.04.2009, 17:48

array->vector

C-/C++-Quelltext

1
2
int foo[] = {16,2,77,29};
std::vector<int> bar (foo, foo + sizeof(foo) / sizeof(int) );
Dann wird eine Kopie von jedem Element in den Vektor gelegt.

vector->array

C-/C++-Quelltext

1
2
3
std::vector<int> foo;
//einige Elemente ablegen

int* bar = &foo[0];
Der Zeiger aufs erste Element des Vectors lässt sich wie ein Array ansprechen. (Wenn man den Vector an sich als C-Array übergeben soll) Ansonsten wie einige schon vorgeschlagen haben mit std::copy.

7

16.04.2009, 18:54

Hier noch die supergenerische Lösung für statische Arrays: :p

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
template <typename T, size_t S>
std::vector<T> ArrayToVector(T (&Array)[S])
{
    return std::vector<T>(Array, Array+S);
}

int main()
{
    int Array[] = {1, 2, 3, 4};
    std::vector<int> Vec = ArrayToVector(Array);
}

Beim umgekehrten Vorgang muss man allerdings aufpassen. Wenn man die Elemente nicht kopiert, sondern mit einem Zeiger auf den Anfang des Vectors verweist, darf man gewisse Operationen am std::vector nicht mehr durchführen, weil diese den Zeiger invalidieren können.

8

16.04.2009, 20:20

Hm, ok, mir wurde aus der Fragestellung nicht so ganz klar, wofür man das braucht. Hat man einmal einen Vector, will man normalerweise nicht mehr mit einem Array weiterarbeiten, deshalb dachte ich, er will es an irgendeine Funktion, die ein Array braucht, übergeben.
Lieber dumm fragen, als dumm bleiben!

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

9

17.04.2009, 02:11

Ich hab diese frage gestellt da es bessere wäre mit vectoren zu arbeiten aber einige funktionen in opengl erwarten z.b. ein array für die pixels im alten C stile.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

17.04.2009, 08:50

Oder du schreibst dir einfach eine eigene Klasse für solche Pixelarrays. Einen vector halt ich bei sowas nur für bedingt geeignet.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#pragma once

#ifndef SURFACE_INCLUDED
#define SURFACE_INCLUDED


template<class T>
class surface
{
public:
  typedef T color_type;

private:
  int _width;
  int _height;
  color_type* _data;

public:

  surface()
    : _data(0), _width(0), _height(0)
  {
  }

  surface(int width, int height)
    : _width(width), _height(height), _data(new T[width * height])
  {
  }

  template<class U>
  surface(const surface<U>& s)
    : surface(s.width, s.height)
  {
    for (int i = 0; i < _width * _height; ++i)
      _data[i] = s._data[i];
  }

  template<class U>
  surface& operator =(const surface<U>& s)
  {
    if (_width != s._width || _height != s._height)
      resize(s._width, s._height);

    for (int i = 0; i < _width * _height; ++i)
      _data[i] = s._data[i];
  }

  ~surface() { delete[] _data; }

  int width() const { return _width; }
  int height() const { return _height; }

  const color_type* getBufferPointer() const { return _data; }
  color_type* getBufferPointer() { return _data; }

  void resize(int width, int height)
  {
    color_type* tmp_data = new T[width*height];
    delete[] _data;
    _width = width;
    _height = height;
    _data = tmp_data;
  }

  void clear(const color_type& c = color_type()) const
  {
    for (int i = 0; i < _width * _height; ++i)
      _data[i] = c;
  }

  const T& operator ()(int x, int y) const { return _data[y*_width + x]; };
  T& operator ()(int x, int y) { return _data[y*_width + x]; };
};

#endif  // SURFACE_INCLUDED

Werbeanzeige