2011-12-30 15 views
11

मुझे पता है कि आप बस कर सकते हैं: &theVector[0], लेकिन यह मानक है? क्या यह व्यवहार है गारंटी है?एक वेक्टर को एक सरणी में परिवर्तित करना - क्या ऐसा करने के लिए 'मानक' तरीका है?

यदि नहीं, तो ऐसा करने के लिए एक बेहतर, कम 'हैकिश' तरीका है?

+5

सी ++ 11 उचित तरीके से कॉल कर सकते हैं 'theVector.data है()'। – ildjarn

+3

ध्यान दें कि 'और वेक्टर [0] 'एक * सरणी * नहीं बल्कि एक * सूचक * उत्पन्न नहीं करता है। विभिन्न प्रकार के साथ, पॉइंटर्स और सरणी भाषा में अलग-अलग चीजें हैं। आप किसी भी मानक तरीके से एक वेक्टर को एक सरणी में * कन्वर्ट नहीं कर सकते हैं, हालांकि आपका दृष्टिकोण डेटा के लिए * पॉइंटर * प्राप्त करने का एक मानक तरीका है। –

+0

मैं इस हैकिश को सी एपीआई के साथ संगतता के रूप में नहीं कहूंगा जो सरणी पॉइंटर्स का उपयोग एसटीएल में एक डिज़ाइन निर्णय था। विकल्प, जिसे कभी-कभी देखा जाता है और * theVector.begin(), का उपयोग नहीं किया जाना चाहिए। – aselle

उत्तर

20

हां, उस व्यवहार की गारंटी है। हालांकि मैं इसे उद्धृत नहीं कर सकता, मानक गारंटी देता है कि वेक्टर तत्वों को याद रखने के लिए स्मृति में लगातार संग्रहित किया जाता है।

यह एक टेम्पलेट विशेषज्ञता की वजह से vector<bool> लिए काम नहीं करेगा:

एक अपवाद है, हालांकि नहीं है।

http://en.wikipedia.org/wiki/Sequence_container_%28C%2B%2B%29#Specialization_for_bool

इस विशेषज्ञता थोड़ा-क्षेत्र में एक साथ bools पैकिंग द्वारा स्मृति को बचाने के लिए प्रयास करता है। हालांकि, यह कुछ semantics तोड़ता है और &theVector[0]vector<bool> पर काम नहीं करेगा।

किसी भी मामले में, vector<bool> व्यापक रूप से considered to be a mistake है इसलिए वैकल्पिक रूप से std::deque<bool> का उपयोग करना है।

+0

मुझे लगता है कि उस मामले में, मुझे इसे 'प्रतिलिपि' या कुछ का उपयोग करके कॉपी करना होगा? –

+1

एक और अपवाद है: यदि वेक्टर खाली है, तो आप उस पर सबस्क्रिप्ट ऑपरेटर का उपयोग नहीं कर सकते हैं। –

+1

@ जोनाथन लिंगल हां, आप ऐसा करने के लिए 'std :: copy()' का उपयोग कर सकते हैं। – Mysticial

-1

कम 'हैकिश' तरीका? खैर आप बस कॉपी कर सकते हैं:

#include <iostream> 
#include <vector> 
using namespace std; 



int main() 
{ 
    vector<int> vect0r; 
    int array[100]; 

    //Fill vector 
    for(int i = 0; i < 10 ; i++) vect0r.push_back(i) ; 

    //Copy vector to array[ ] 
    for( i = 0; i < vect0r.size(); i++) array[i] = vect0r[i]; 

    //Dispay array[ ] 
    for( i = 0; i < vect0r.size(); i++) cout<< array[i] <<" \n"; 

    cout<<" \n"; 

return 0; 
} 

यहाँ अधिक: How to convert vector to array in C++

+0

'int array [vec.size()] ; कानूनी सी ++ नहीं है। – ildjarn

+0

'MAGIC_NUMBER' कोडिंग तकनीकी रूप से कानूनी है, लेकिन एक बहुत ही बुरी चीज है। यह बेहतर नहीं है। – Puppy

13

सी ++ 11 जो एक T* रिटर्न std::vector पर data() तरीका प्रदान करता है। यह तुम क्या करने की अनुमति देता है:

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> vector = {1,2,3,4,5}; 
    int* array = vector.data(); 
    std::cout << array[4] << std::endl; //Prints '5' 
} 

हालांकि, ऐसा करने के लिए (या तरीकों कि ऊपर उल्लेख किया के किसी भी) खतरनाक के रूप में सूचक अमान्य हो सकता है अगर वेक्टर आकार दिया जाता है हो सकता है। इसे दिखाया जा सकता है:

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> vector = {1,2,3,4,5}; 
    int* array = vector.data(); 

    vector.resize(100); //This will reserve more memory and move the internal array 

    //This _may_ end up taking the place of the old array  
    std::vector<int> other = {6,7,8,9,10}; 

    std::cout << array[4] << std::endl; //_May_ now print '10' 
} 

यह किसी भी चीज को क्रैश या कर सकता है ताकि इसका उपयोग करके सावधान रहें।

0

हम डेटा() विधि का उपयोग कर ऐसा कर सकते हैं। सी ++ 11 इस विधि को प्रदान करता है। यह वेक्टर में पहले तत्व के लिए एक सूचक देता है। वेक्टर यहां तक ​​कि अगर यह खाली है, हम इस समारोह में ही समस्याओं

बिना
vector<int>v; 
    int *arr = v.data(); 
संबंधित मुद्दे