Hoe converteer je vector naar array

Hoe converteer ik een std::vector<double>naar een double array[]?


Antwoord 1, autoriteit 100%

Er is een vrij eenvoudige truc om dit te doen, aangezien de spec nu garantiesvectoren slaan hun elementen aaneengesloten op:

std::vector<double> v;
double* a = &v[0];

Antwoord 2, autoriteit 28%

Waarvoor? Je moet verduidelijken: heb je een pointer nodig naar het eerste element van een array, of een array?

Als je een API-functie aanroept die de eerste verwacht, kun je do_something(&v[0], v.size())doen, waarbij vis een vector van doubleen. De elementen van een vector zijn aaneengesloten.

Anders hoeft u alleen elk element te kopiëren:

double arr[100];
std::copy(v.begin(), v.end(), arr);

Zorg ervoor dat niet alleen de arrgroot genoeg is, maar dat arrook vol raakt, of dat je niet-geïnitialiseerde waarden hebt.


Antwoord 3, autoriteit 22%

Voor C++11, vector.data()zal het lukken.


Antwoord 4, autoriteit 4%

vector<double> thevector;
//...
double *thearray = &thevector[0];

Dit werkt gegarandeerd volgens de standaard, maar er zijn enkele kanttekeningen: zorg er in het bijzonder voor dat u alleen thearraygebruikt terwijl thevectorbinnen het bereik is.


Antwoord 5, autoriteit 3%

Vectoren zijn in feite arrays onder de huid. Als je een functie hebt:

void f( double a[]);

je kunt het zo noemen:

vector <double> v;
v.push_back( 1.23 )
f( &v[0] );

Het zou nooit nodig moeten zijn om een ​​vector om te zetten in een echte array-instantie.


Antwoord 6, autoriteit 2%

Wat betreft std::vector<int> vec, vec om int*te krijgen, je kunt twee methoden gebruiken:

  1. int* arr = &vec[0];

  2. int* arr = vec.data();

Als u een type Tvector wilt converteren naar T* array, vervangt u gewoon de bovenstaande intnaar T.

Ik zal je laten zien waarom de bovenstaande twee werken, voor een goed begrip?

std::vectoris in wezen een dynamische array.

Hoofdgegevenslid zoals hieronder:

template <class T, class Alloc = allocator<T>>
class vector{
    public:
        typedef T          value_type;
        typedef T*         iterator;
        typedef T*         pointer;
        //.......
    private:
        pointer start_;
        pointer finish_;
        pointer end_of_storage_;
    public:
        vector():start_(0), finish_(0), end_of_storage_(0){}
    //......
}

Het range (start_, end_of_storage_)is al het arraygeheugen dat de vector toewijst;

Het range(start_, finish_)is al het arraygeheugen dat de vector heeft gebruikt;

Het range(finish_, end_of_storage_)is het back-uparraygeheugen.

Bijvoorbeeld voor een vector vec. die {9, 9, 1, 2, 3, 4} heeft, kan de onderstaande aanwijzer leuk vinden.

voer hier de afbeeldingsbeschrijving in

Dus &vec[0]= start_ (adres.) (start_ is gelijk aan int* arraykop)

In c++11retourneert de data()lidfunctie gewoon start_

pointer data()
{ 
     return start_; //(equivalent to `value_type*`, array head)
}

Antwoord 7

We kunnen dit doen met de data()-methode. C++11 biedt deze methode.

Codefragment

#include<bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(false);
  vector<int>v = {7, 8, 9, 10, 11};
  int *arr = v.data();
  for(int i=0; i<v.size(); i++)
  {
    cout<<arr[i]<<" ";
  }
  return 0;
}

Antwoord 8

std::vector<double> vec;
double* arr = vec.data();

Antwoord 9

Als je een functie hebt, heb je waarschijnlijk deze nodig:foo(&array[0], array.size());. Als het je is gelukt om in een situatie te komen waarin je een array nodig hebt, moet je refactoren, vectoren zijn in feite uitgebreide arrays, je moet ze altijd gebruiken.


Antwoord 10

Je kunt zoiets doen

vector <int> id;
vector <double> v;
if(id.size() > 0)
{
    for(int i = 0; i < id.size(); i++)
    {
        for(int j = 0; j < id.size(); j++)
        {
            double x = v[i][j];
            cout << x << endl;
        }
    }
}

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes