2013-03-05 7 views
7
struct sample { 
    int x; 
    int y; 
    int arr[10]; 
}; 

int arr2[10] = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5}; 

int a = 19; 
int b = 22; 
struct sample* samp = new sample; 
samp->x = a; 
samp->y = b; 
samp->arr = ?? 

ऊपर के उदाहरण में से एक संरचना के भीतर एक सरणी आरंभ किया जा रहा है, मैं संरचना के भीतर सरणी प्रारंभ करने में आगमन [10]arr2 [10] के तत्वों के साथ की जरूरत है।सी में एक और सरणी ++

सी ++ में इसे कैसे करें ??

+4

कच्चे सरणी का उपयोग करना बंद करें और ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector) या [' std :: array'] (http://en.cppreference.com/w/cpp/container/array)। –

+0

बस अगर आपने प्राथमिक सलाह को गंभीरता से नहीं लिया है। यदि आप सी ++ करना चाहते हैं, तो सामान्य रूप से std :: वेक्टर, और मानक लाइब्रेरी कंटेनर का उपयोग करें। –

+0

अपना ** नमूना बदलें -> ** ** ** सैंप -> **। ** नमूना ** टैग नाम है और इस तरह इस्तेमाल नहीं किया जा सकता है। –

उत्तर

3

सी ++ में इसे कैसे करें ??

सबसे आसान समाधान std::copy का उपयोग करना है जैसा कि दूसरों ने कहा था। memcpy सी ++ में उपयोग करें, std::copy पीओडी के लिए समान है लेकिन गैर-पीओडी के लिए भी लागू है और केवल सही चीज है। यदि आपके सरणी में टाइप एक दिन बदलता है, तो आपको उन सभी स्थानों पर फिर से जाना होगा जहां आप ऐसी प्रतिलिपि करते हैं और memcpy को प्रतिस्थापित करते हैं। (और आप स्थानों में से किसी एक को याद करते हैं और बग को खोजने में कठिनाई होती है)। C++ में memcpy का उपयोग करने से कोई लाभ नहीं है, इसलिए शुरुआत से std::copy का उपयोग करें।

बेहतर समाधान इस मामले में उपयोग सी ++ डेटा संरचनाओं होगा, का उपयोग करें, std::array

#include <array> 
struct sample { 
     int x; 
     int y; 
     std::array<int, 10> arr; //C++ array instead of plain C array 
    }; 

int main() 
{ 
    std::array<int, 10> arr2 = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5}; 

    int a = 19; 
    int b = 22; 

    // 1: no need to say "struct sample*" since C++98 
    // 2: prefer to use smart pointers.. 
    //sample* samp = new sample; 
    std::unique_ptr<sample> samp(new sample()); 
    samp->x = a; 
    samp->y = b; 
    samp->arr = arr2; //it's as easy as it should be! 

    // 3: ... so ypu can't forget to delete! 
    //delete samp; 
} 

संपादित करें: मैं यहाँ unique_ptr इस्तेमाल किया है, हालांकि यह थोड़ा उदाहरण में आप की जरूरत नहीं है ढेर आवंटन का उपयोग करने के लिए बिल्कुल। ग्रिजेश के प्रारंभिकरण में भी लाने के लिए:

int main() 
{ 
    std::array<int, 10> arr2 = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5}; 

    int a = 19; 
    int b = 22; 

    sample samp = {a, b, arr2}; //done! 
} 

कोई आवंटन, कोई सफाई नहीं, कोई तत्व-वार असाइनमेंट की आवश्यकता नहीं है।

+0

ठीक है यह आपका 'std :: array' अच्छा है :) –

3

आप memcpy का उपयोग कर सकते हैं:

memcpy(sample->arr,arr2,sizeof(int) * 10) 

लेकिन मैं दोनों के लिए std :: वेक्टर उपयोग करने का सुझाव होगा।

+5

आपको चाहिए: '10 * आकार (int)' – hannes

+0

@ हांस हां , आप पूरी तरह से सही हैं। – Lucian

+1

'memcpy' पर' std :: copy' को प्राथमिकता दें, इसलिए यदि टाइप गैर-पीओडी 'MyIntType' में बदल जाता है तो आपको वापस आने की आवश्यकता नहीं है। और वेक्टर गतिशील आवंटन है, आपको इसकी आवश्यकता नहीं है यदि आप आकार जानते हैं और यह नहीं बदलता है - 'std :: array' उन मामलों के लिए बेहतर कंटेनर है। –

1

कॉपी सरणी पाश के लिए उपयोग करते हुए,

for(int i=0; i<10; i++) { 
    samp->arr[i]=arr2[i]; 
} 
+0

अगर एल्गोरिदम ऐसा कर सकता है तो हस्तलिखित loops का उपयोग क्यों करें? –

0

आमतौर पर एक का प्रयोग करेंगे std::copy (<algorithm>) इस के लिए:

std::copy(std::begin(arr2), std::end(arr2), std::begin(samp->arr)); 

ध्यान दें कि std::begin() और std::end() (<iterator>) सी ++ 11 समर्थन की जरूरत है। अपने संकलक सी ++ 11 का समर्थन नहीं करता, तो आप काफी आसानी से अपने आप को इस काम करता है प्रदान करते हैं या सूचक arithmetics उपयोग कर सकते हैं:

std::copy(arr2, arr2 + 10, samp->arr); 

कि दुख की बात की जा रही है, तो आप गतिशील सरणियों या std::array (ग के लिए std::vector उपयोग करने के लिए प्रयास करना चाहिए ++ 11) निश्चित आकार सरणी के लिए।

संबंधित मुद्दे