Bagaimana mengkonversi vektor ke array

352

Bagaimana saya mengonversi a std::vector<double>ke a double array[]?

Ganuke
sumber
9
Agak memunculkan pertanyaan mengapa? Anda dapat mengakses vektor sebagai array. Apa yang dilakukan array yang tidak dimiliki oleh vektor?
Michael Dorgan
96
@Michael Kasus penggunaan umum yang saya miliki adalah menggunakan vektor dalam kode saya sendiri dan perlu memanggil fungsi pihak ketiga yang mengambil array
Michael Mrozek
7
Terminologi yang dilontarkan membingungkan. Pointer bukan sebuah array. Apakah kita ingin pointer ke elemen pertama array, atau array?
GManNickG
7
benar-benar pertanyaan nyata - cukup sederhana, mudah ditafsirkan, juga. tolong buka kembali.
dbliss
10
"Agak memohon pertanyaan mengapa?" - Pertama, penyalahgunaan frasa itu. Kedua, mengapa itu jelas berdarah.
Jim Balter

Jawaban:

533

Ada trik yang cukup sederhana untuk melakukannya, karena spec sekarang menjamin vektor menyimpan elemen-elemennya secara bersamaan:

std::vector<double> v;
double* a = &v[0];
Michael Mrozek
sumber
29
@ganuke Anda tidak menyalin, Anda membuat pointer yang menunjuk ke array aktual yang digunakan vektor secara internal. Jika Anda ingin menyalin jawaban GMan, jelaskan caranya
Michael Mrozek
4
@ganuke: Apa itu "array"? Anda perlu memberikan informasi lebih lanjut. Apa gambaran besarnya?
GManNickG
6
@ganuke Anda tidak, Anda hanya perlu double*yang menunjuk ke data yang sama. Jawaban ini tepat untuk kasus itu
Michael Mrozek
6
@guneykayim Vektor memiliki memori itu, Anda tidak harus membebaskannya
Michael Mrozek
23
std::vector<double> v; double* a = v.data();
sinoTrinity
148

Untuk apa? Anda perlu mengklarifikasi: Apakah Anda memerlukan pointer ke elemen pertama array, atau array?

Jika Anda memanggil fungsi API yang mengharapkan yang pertama, Anda dapat melakukannya do_something(&v[0], v.size()), di mana vvektor doubles. Elemen-elemen vektor berdekatan.

Jika tidak, Anda hanya perlu menyalin setiap elemen:

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

Pastikan tidak hanya arritu cukup besar, tetapi itu arrakan terisi, atau Anda memiliki nilai yang tidak diinisialisasi.

GManNickG
sumber
15
Catatan: gunakan v.size () untuk mendapatkan jumlah elemen untuk array baru: double arr [v.size ()];
rbaleksandar
7
@rbaleksandar: Array tidak dapat memiliki ukuran ekspresi yang tidak konstan.
GManNickG
@ GMNickG: Berhasil tapi saya pikir ada beberapa kesalahpahaman di sini. Bayangkan berikut ini: Anda memiliki kelas dengan sekelompok pointer dari berbagai jenis yang harus menunjuk ke array, yang tidak diketahui pada saat Anda mendefinisikan kelas Anda dan yang kemudian dibuat dengan menyiram berbagai vektor dan menggunakan ukuran-parameternya untuk menentukan berapa banyak ruang yang akan digunakan. Contoh lain: fungsi void arrayTest sederhana (unsigned int arrSize), yang membuat sebuah array (arr [ukuran kecil];) di dalamnya dengan menggunakan parameter fungsi untuk ukuran.
rbaleksandar
1
@rbaleksandar. Tidak salah paham; dalam C ++ 11 dan sebelumnya, ukuran array harus ekspresi konstan integral. Contoh fungsi Anda adalah penggunaan umum untuk VLA di C, tetapi hanya didukung oleh ekstensi (tidak standar) di C ++. Ini mungkin datang ke C ++ 14: stackoverflow.com/a/17318040/87234 . Tetapi sampai sekarang, itu bukan pilihan standar.
GManNickG
1
@GManNickG Saya pikir @Jet mengatakan bahwa jika Anda ingin mengkonversi vektor ke array, dan Anda bermaksud untuk mengukur array menggunakan size()fungsi std:vectorAnda harus menggunakan newatau mallocuntuk melakukannya. Seperti yang sudah ditunjukkan (oleh Anda) itu double arr[v.size()]tidak valid. Menggunakan vektor di tempat yang baru adalah ide yang bagus, tetapi seluruh poin dari pertanyaan adalah bagaimana Anda dapat mengubah vektor menjadi sebuah array.
RyanP
17
vector<double> thevector;
//...
double *thearray = &thevector[0];

Ini dijamin untuk bekerja sesuai standar, namun ada beberapa peringatan: khususnya berhati-hati untuk hanya menggunakan thearraysaat thevectorberada dalam ruang lingkup.

pengguna168715
sumber
4
... dan pastikan vektornya tidak empty(), jika tidak ini akan memanggil UB yang ditakuti.
sbi
13

Vektor secara efektif adalah array di bawah kulit. Jika Anda memiliki fungsi:

void f( double a[]);

Anda bisa menyebutnya seperti ini:

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

Anda seharusnya tidak perlu mengubah vektor menjadi instance array aktual.


sumber
1
Saya pikir Anda bermaksud f( &v[0] );untuk kalimat terakhir Anda
Michael Mrozek
10

Seperti untuk std::vector<int> vec, vec untuk mendapatkan int*, Anda dapat menggunakan dua metode:

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

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

Jika Anda ingin mengkonversi semua jenis Tvektor untuk T* array, hanya mengganti di atas intuntuk T.

Saya akan menunjukkan kepada Anda mengapa dua di atas bekerja, untuk pengertian yang baik?

std::vector adalah array dinamis pada dasarnya.

Anggota data utama seperti di bawah ini:

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_)adalah semua memori array yang vektor mengalokasikan;

Ini range(start_, finish_)semua memori array yang digunakan vektor;

Ini range(finish_, end_of_storage_)adalah memori array cadangan.

Misalnya, untuk vec vektor. yang memiliki {9, 9, 1, 2, 3, 4} adalah pointer mungkin seperti di bawah ini.

masukkan deskripsi gambar di sini

Jadi &vec[0]= start_ (alamat.) (Start_ sama dengan int * array head)

Di c++11 dalam data()fungsi anggota hanya kembali start_

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

Kita dapat melakukan ini menggunakan metode data (). C ++ 11 menyediakan metode ini.

Cuplikan Kode

#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;
}
ruam
sumber
2
std::vector<double> vec;
double* arr = vec.data();
Toby
sumber
1

Jika Anda memiliki fungsi, maka Anda mungkin perlu ini: foo(&array[0], array.size());. Jika Anda berhasil masuk ke situasi di mana Anda memerlukan array maka Anda perlu refactor, vektor pada dasarnya adalah array diperpanjang, Anda harus selalu menggunakannya.


sumber
-1

Anda dapat melakukan beberapa hal seperti ini

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;
        }
    }
}
Sakthi Vignesh
sumber
v [i] [j]; untuk array 2d
Sakthi Vignesh