How do I convert a std::vector<double> to a double array[]?

6

10 Answers

There's a fairly simple trick to do so, since the spec now guarantees vectors store their elements contiguously:

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

What for? You need to clarify: Do you need a pointer to the first element of an array, or an array?

If you're calling an API function that expects the former, you can do do_something(&v[0], v.size()), where v is a vector of doubles. The elements of a vector are contiguous.

Otherwise, you just have to copy each element:

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

Ensure not only thar arr is big enough, but that arr gets filled up, or you have uninitialized values.

14

For C++11, vector.data() will do the trick.

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

This is guaranteed to work by the standard, however there are some caveats: in particular take care to only use thearray while thevector is in scope.

2

As to std::vector<int> vec, vec to get int*, you can use two method:

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

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

If you want to convert any type T vector to T* array, just replace the above int to T.

I will show you why does the above two works, for good understanding?

std::vector is a dynamic array essentially.

Main data member as below:

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){} //...... } 

The range (start_, end_of_storage_) is all the array memory the vector allocate;

The range(start_, finish_) is all the array memory the vector used;

The range(finish_, end_of_storage_) is the backup array memory.

For example, as to a vector vec. which has {9, 9, 1, 2, 3, 4} is pointer may like the below.

enter image description here

So &vec[0] = start_ (address.) (start_ is equivalent to int* array head)

In c++11 the data() member function just return start_

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

Vectors effectively are arrays under the skin. If you have a function:

void f( double a[]); 

you can call it like this:

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

You should not ever need to convert a vector into an actual array instance.

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

We can do this using data() method. C++11 provides this method.

Code Snippet

#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; } 

If you have a function, then you probably need this:foo(&array[0], array.size());. If you managed to get into a situation where you need an array then you need to refactor, vectors are basically extended arrays, you should always use them.

You can do some what like this

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; } } } 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy