2012-09-11 17 views
25

बनाने के लिए वेक्टर का वेक्टर मैं 2 डी मैट्रिक्स के आयामों के लिए इनपुट लेने की कोशिश कर रहा हूं। और फिर इस मैट्रिक्स को भरने के लिए उपयोगकर्ता इनपुट का उपयोग करें। जिस तरह से मैंने ऐसा करने की कोशिश की वेक्टर (वेक्टर के वैक्टर) के माध्यम से है। लेकिन जब भी मैं डेटा में पढ़ने की कोशिश करता हूं और इसे मैट्रिक्स में जोड़ता हूं तो मुझे कुछ त्रुटियों का सामना करना पड़ता है।मैट्रिक्स

//cin>>CC; cin>>RR; already done 
vector<vector<int> > matrix; 
for(int i = 0; i<RR; i++) 
{ 
    for(int j = 0; j<CC; j++) 
    { 
    cout<<"Enter the number for Matrix 1"; 
     cin>>matrix[i][j]; 
    } 
} 

जब भी मैं ऐसा करने का प्रयास करता हूं, तो यह मुझे रेंज त्रुटि से एक सबस्क्रिप्ट देता है। कोई सलाह?

+3

आपने 'मैट्रिक्स 'प्रारंभ नहीं किया था। – elyashiv

+0

@elyashiv वास्तव में, 'matrix' प्रारंभ किया गया है। –

+1

@ लचियन ग्रिगोर वेक्टर प्रारंभ में खाली हैं। इस प्रकार, सीमा त्रुटि से बाहर। –

उत्तर

43

यह है के रूप में, अपने वेक्टर के दोनों आयामों 0.

बजाय कर रहे हैं, इस के रूप में वेक्टर प्रारंभ:

vector<vector<int> > matrix(RR); 
for (int i = 0 ; i < RR ; i++) 
    matrix[i].resize(CC); 

यह आपको सभी तत्वों 0 करने के लिए सेट के साथ आयामों के एक मैट्रिक्स RR * CC दे देंगे ।

+1

आप एक कथन में आकार 'सीसी' वैक्टर का आकार' आरआर' वेक्टर बना सकते हैं और आकार से बच सकते हैं। – juanchopanza

+0

@juanchopanza क्या आप std :: उत्पन्न या केवल असाइनमेंट के बारे में बात कर रहे हैं? –

5

मैं C++ से परिचित नहीं हूँ, लेकिन प्रलेखन का शीघ्रता से अवलोकन चलता है कि यह काम करना चाहिए:

//cin>>CC; cin>>RR; already done 
vector<vector<int> > matrix; 
for(int i = 0; i<RR; i++) 
{ 
    vector<int> myvector; 
    for(int j = 0; j<CC; j++) 
    { 
     int tempVal = 0; 
     cout<<"Enter the number for Matrix 1"; 
     cin>>tempVal; 
     myvector.push_back(tempVal); 
    } 
    matrix.push_back(myvector); 
} 
+3

सही है, लेकिन यह बाद के पुश-बैक के कारण प्रदर्शन दंड से पीड़ित है। –

+8

@ लचियनग्रिगोर: std :: cin से एक मैट्रिक्स पढ़ना प्रदर्शन के बारे में आपकी तर्क को मारता है – stefan

90

आप किसी भी तत्व एक्सेस करने से पहले उचित आकार के लिए वैक्टर की वेक्टर प्रारंभ करने की है। आप इसे इस तरह कर सकते हैं:

// assumes using std::vector for brevity 
vector<vector<int>> matrix(RR, vector<int>(CC)); 

यह RR आकार CC वैक्टर का एक वेक्टर, 0 से भरा बनाता है।

+1

+1: यही वह है जो मैं करता हूं। आश्चर्यचकित आप अकेले हैं जिन्होंने यह जवाब दिया। एक तरफ के रूप में, मै मैट्रिक्स का प्रतिनिधित्व करने के लिए वेक्टरों के वेक्टर का कभी भी उपयोग नहीं करता। =) – paddy

+1

@paddy मैं इसका उपयोग नहीं करता। किसी भी समय किसी स्तंभ या पंक्ति का मनमाने ढंग से आकार बदलने या सृजन के बाद मैट्रिक्स के आयामों को बदलने में सक्षम होने का विचार, मेरे लिए बहुत डरावना है। – juanchopanza

+0

मैट्रिक्स के आयामों को बदलने के लिए सामान्य है (मैटलैब में आप इसे हर समय करते हैं), लेकिन वास्तविक दुनिया के उपयोग में, मैट्रिक्स एक संगत ब्लॉक है, और आप जो भी बदल रहे हैं वह पंक्तियां/कोल्स है (मूल रूप से घुमावदार ट्रैक -लम्बाई) - मैट्रिक्स में एक तत्व को अनुक्रमणित करने के लिए, आप अपने बहु-आयामी सूचकांक से रैखिक अनुक्रमणिका की गणना करते हैं। – paddy

1

इसे आजमाएं। एम = पंक्ति, एन = कोल

vector< vector<int> > matrix(m,vector<int>(n)); 

for(i=0;i<m;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
     cin>>matrix[i][j]; 
    } 
    cout<<endl; 
} 
cout<<"::matrix::"<<endl; 
for(i=0;i<m;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
     cout<<matrix[i][j]<<" "; 
    } 
    cout<<endl; 
}