वेक्टर को ऐरे में कैसे बदलें


352

मैं a std::vector<double>को कैसे परिवर्तित करूं double array[]?


9
किंडा ने सवाल किया कि क्यों? आप एक वेक्टर को एक सरणी के रूप में एक्सेस कर सकते हैं। एक सरणी क्या करता है कि एक वेक्टर नहीं करता है?
माइकल डोरगन

96
@ मिचेल मेरे पास विशिष्ट उपयोग का मामला मेरे अपने कोड में एक वेक्टर का उपयोग कर रहा है और एक तीसरे पक्ष के फ़ंक्शन को कॉल करने की आवश्यकता है जो एक सरणी लेता है
माइकल Mrozek

7
चारों ओर फेंकी जा रही शब्दावली भ्रामक है। एक सूचक एक सरणी नहीं है। क्या हम किसी सरणी के पहले तत्व या एक सरणी के लिए एक संकेतक चाहते हैं?
GManNickG

7
बिल्कुल एक वास्तविक सवाल - काफी सरल, आसानी से व्याख्या की गई। कृपया फिर से खोलें।
डेबिस

10
"किन्दा भीख माँगता है क्यों?" - सबसे पहले, उस वाक्यांश का दुरुपयोग। दूसरा, यह स्पष्ट रक्तस्राव क्यों है।
जिम बाल्टर

जवाबों:


533

ऐसा करने के लिए काफी सरल चाल है, क्योंकि अब कल्पना की गारंटी देता है कि वैक्टर अपने तत्वों को संचित रूप से संग्रहीत करते हैं:

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

29
@ganuke आप नकल नहीं कर रहे हैं, आप एक संकेतक बना रहे हैं जो वास्तविक सरणी को इंगित करता है जो वेक्टर आंतरिक रूप से उपयोग कर रहा है। यदि आप GMan के उत्तर की प्रतिलिपि बनाना चाहते हैं, तो बताते हैं कि कैसे
माइकल Mrozek

4
@ganuke: "सरणी" क्या है? आपको अधिक जानकारी प्रदान करने की आवश्यकता है। क्या है बड़ी तस्वीर?
GManNickG

6
@ganuke तुम नहीं, तुम सिर्फ एक double*ही डेटा के लिए एक अंक की जरूरत है । यह उत्तर ठीक उसी स्थिति के लिए काम करता है
माइकल Mrozek

6
@guneykayim वेक्टर उस स्मृति का मालिक है, आपको इसे खाली नहीं करना चाहिए
माइकल मर्जेक

23
std::vector<double> v; double* a = v.data();
38३३

148

किस लिए? आपको स्पष्ट करने की आवश्यकता है: क्या आपको किसी सरणी के पहले तत्व या एक सरणी के लिए एक संकेतक की आवश्यकता है?

यदि आप एक एपीआई फ़ंक्शन को बुला रहे हैं जो पूर्व की अपेक्षा करता है, तो आप कर सकते हैं do_something(&v[0], v.size()), जहां vएक वेक्टर हैdouble । एक वेक्टर के तत्व सन्निहित हैं।

अन्यथा, आपको बस प्रत्येक तत्व को कॉपी करना होगा:

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

सुनिश्चित करें कि न केवल थार arrकाफी बड़ा है, लेकिन यह arrभर जाता है, या आपके पास असमान मूल्य हैं।


15
नोट: नए सरणी के लिए तत्वों की संख्या प्राप्त करने के लिए v.size () का उपयोग करें: डबल अरेस्ट [v.size ()];
rbaleksandar

7
@rbaleksandar: Arrays में एक अ-स्थिर अभिव्यक्ति आकार नहीं हो सकता है।
GMANNICKG

@GManNickG: यह काम करता है लेकिन मुझे लगता है कि यहां कुछ गलतफहमी है। निम्नलिखित की कल्पना करें: आपके पास विभिन्न प्रकार के पॉइंटर्स के झुंड के साथ एक वर्ग है, जिसे सरणियों को इंगित करना है, जो उस समय ज्ञात नहीं होते हैं जब आप अपनी कक्षा को परिभाषित करते हैं और जो बाद में विभिन्न वैक्टरों को फ्लश करके और उनके आकार-पैरामीटर का उपयोग करके बनाया जाता है यह निर्धारित करने के लिए कि कितना स्थान उपयोग किया जाना है। एक अन्य उदाहरण: एक साधारण फ़ंक्शन void arrayTest (अहस्ताक्षरित int arrSize), जो आकार के लिए इसके फ़ंक्शन-पैरामीटर का उपयोग करके इसमें एक सरणी (संक्षिप्त गिरफ्तारी [संक्षिप्त करें];) बनाता है।
rbaleksandar

1
@ralealeksandar कोई गलतफहमी नहीं; C ++ 11 और पूर्व में, सरणी आकार अभिन्न स्थिर अभिव्यक्ति होना चाहिए। आपका फ़ंक्शन उदाहरण C में VLAs के लिए एक सामान्य उपयोग है, लेकिन केवल C ++ में (गैर-मानक) एक्सटेंशन द्वारा समर्थित है। यह C ++ 14 के लिए आ सकता है: stackoverflow.com/a/17318040/87234 । लेकिन अभी तक, यह केवल एक मानक विकल्प नहीं है।
GMANNICKG

1
@GManNickG मुझे लगता है कि @Jet कह रहा है कि यदि आप किसी वेक्टर को किसी सरणी में बदलना चाहते हैं, और आप उस सरणी को आकार देना चाहते हैं, जिसके उपयोग से आपको size()फ़ंक्शन का std:vectorउपयोग करना होगा newया mallocऐसा करना होगा। जैसा कि यह पहले से ही (आपके द्वारा) इंगित किया गया है कि double arr[v.size()]मान्य नहीं है। नए के स्थान पर वेक्टर का उपयोग करना एक अच्छा विचार है, लेकिन सवाल का संपूर्ण बिंदु यह है कि आप वेक्टर को एक सरणी में कैसे बदल सकते हैं।
रयान


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

यह मानक द्वारा काम करने की गारंटी है, हालांकि कुछ चेतावनी भी हैं: विशेष रूप से केवल तब तक उपयोग करने का ख्याल रखें thearrayजब तक thevectorकि गुंजाइश हो।


4
... और सुनिश्चित करें कि वेक्टर नहीं है empty(), अन्यथा यह खूंखार यूबी का आह्वान करेगा।
sbi

13

वैक्टर त्वचा के नीचे प्रभावी रूप से ऐरे होते हैं। यदि आप एक समारोह है:

void f( double a[]);

आप इसे इस तरह कह सकते हैं:

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

आपको कभी भी वेक्टर को वास्तविक सरणी उदाहरण में बदलने की आवश्यकता नहीं होनी चाहिए।


1
मुझे लगता है कि आप f( &v[0] );अपनी अंतिम पंक्ति के लिए थे
माइकल Mrozek

10

के रूप में std::vector<int> vec, vec प्राप्त करने के लिए int*, आप दो विधि का उपयोग कर सकते हैं:

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

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

यदि आप किसी भी प्रकार के Tसदिश को रूपांतरित करना चाहते हैं T* array, तो बस उपरोक्त intको बदलेंT

मैं आपको दिखाता हूँ कि अच्छी समझ के लिए उपरोक्त दोनों काम क्यों करता है?

std::vector अनिवार्य रूप से एक गतिशील सरणी है।

नीचे के रूप में मुख्य डेटा सदस्य:

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

range (start_, end_of_storage_)सभी सरणी स्मृति वेक्टर आवंटित है,

range(start_, finish_)सभी सरणी स्मृति वेक्टर इस्तेमाल किया है,

range(finish_, end_of_storage_)बैकअप सरणी स्मृति है।

उदाहरण के लिए, वेक्टर वेक्टर के रूप में। जिसमें {9, 9, 1, 2, 3, 4} है, नीचे की तरह पॉइंटर हो सकता है।

यहां छवि विवरण दर्ज करें

तो &vec[0]= start_ (पता।) (start_ int * सरणी सिर के बराबर है)

में सदस्य समारोह बस लौट start_c++11data()

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

2

हम डेटा () विधि का उपयोग करके ऐसा कर सकते हैं। C ++ 11 यह विधि प्रदान करता है।

सांकेतिक टुकड़ा

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


1

यदि आपके पास कोई फ़ंक्शन है, तो संभवतः आपको इसकी आवश्यकता है foo(&array[0], array.size());:। यदि आप एक ऐसी स्थिति में जाने में कामयाब रहे जहां आपको एक सरणी की आवश्यकता होती है तो आपको रिफ्लेक्टर की आवश्यकता होती है, वैक्टर मूल रूप से विस्तारित ऐरे हैं, आपको हमेशा उनका उपयोग करना चाहिए।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.