मैं a std::vector<double>
को कैसे परिवर्तित करूं double array[]
?
मैं a std::vector<double>
को कैसे परिवर्तित करूं double array[]
?
जवाबों:
ऐसा करने के लिए काफी सरल चाल है, क्योंकि अब कल्पना की गारंटी देता है कि वैक्टर अपने तत्वों को संचित रूप से संग्रहीत करते हैं:
std::vector<double> v;
double* a = &v[0];
double*
ही डेटा के लिए एक अंक की जरूरत है । यह उत्तर ठीक उसी स्थिति के लिए काम करता है
std::vector<double> v; double* a = v.data();
किस लिए? आपको स्पष्ट करने की आवश्यकता है: क्या आपको किसी सरणी के पहले तत्व या एक सरणी के लिए एक संकेतक की आवश्यकता है?
यदि आप एक एपीआई फ़ंक्शन को बुला रहे हैं जो पूर्व की अपेक्षा करता है, तो आप कर सकते हैं do_something(&v[0], v.size())
, जहां v
एक वेक्टर हैdouble
। एक वेक्टर के तत्व सन्निहित हैं।
अन्यथा, आपको बस प्रत्येक तत्व को कॉपी करना होगा:
double arr[100];
std::copy(v.begin(), v.end(), arr);
सुनिश्चित करें कि न केवल थार arr
काफी बड़ा है, लेकिन यह arr
भर जाता है, या आपके पास असमान मूल्य हैं।
size()
फ़ंक्शन का std:vector
उपयोग करना होगा new
या malloc
ऐसा करना होगा। जैसा कि यह पहले से ही (आपके द्वारा) इंगित किया गया है कि double arr[v.size()]
मान्य नहीं है। नए के स्थान पर वेक्टर का उपयोग करना एक अच्छा विचार है, लेकिन सवाल का संपूर्ण बिंदु यह है कि आप वेक्टर को एक सरणी में कैसे बदल सकते हैं।
vector<double> thevector;
//...
double *thearray = &thevector[0];
यह मानक द्वारा काम करने की गारंटी है, हालांकि कुछ चेतावनी भी हैं: विशेष रूप से केवल तब तक उपयोग करने का ख्याल रखें thearray
जब तक thevector
कि गुंजाइश हो।
empty()
, अन्यथा यह खूंखार यूबी का आह्वान करेगा।
वैक्टर त्वचा के नीचे प्रभावी रूप से ऐरे होते हैं। यदि आप एक समारोह है:
void f( double a[]);
आप इसे इस तरह कह सकते हैं:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
आपको कभी भी वेक्टर को वास्तविक सरणी उदाहरण में बदलने की आवश्यकता नहीं होनी चाहिए।
f( &v[0] );
अपनी अंतिम पंक्ति के लिए थे
के रूप में std::vector<int> vec
, vec प्राप्त करने के लिए int*
, आप दो विधि का उपयोग कर सकते हैं:
int * arrest = & vec [0];
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++11
data()
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
हम डेटा () विधि का उपयोग करके ऐसा कर सकते हैं। 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;
}
यदि आपके पास कोई फ़ंक्शन है, तो संभवतः आपको इसकी आवश्यकता है foo(&array[0], array.size());
:। यदि आप एक ऐसी स्थिति में जाने में कामयाब रहे जहां आपको एक सरणी की आवश्यकता होती है तो आपको रिफ्लेक्टर की आवश्यकता होती है, वैक्टर मूल रूप से विस्तारित ऐरे हैं, आपको हमेशा उनका उपयोग करना चाहिए।
आप ऐसा कुछ कर सकते हैं
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;
}
}
}