वास्तव में बहुत ही आत्म-व्याख्यात्मक प्रश्न। मैं गणित में वैक्टर के बारे में अस्पष्ट रूप से जानता हूं, लेकिन मैं वास्तव में सी ++ वैक्टर का लिंक नहीं देखता हूं।
वास्तव में बहुत ही आत्म-व्याख्यात्मक प्रश्न। मैं गणित में वैक्टर के बारे में अस्पष्ट रूप से जानता हूं, लेकिन मैं वास्तव में सी ++ वैक्टर का लिंक नहीं देखता हूं।
जवाबों:
वेक्टर की गणितीय परिभाषा सेट का एक सदस्य है S
n
, जो एक विशिष्ट सेट ( S
) में मूल्यों का एक क्रमबद्ध क्रम है । यह वह है जो C ++ vector
स्टोर करता है।
std::vector
प्रदान नहीं करता है, 3. तर्क यह है कि std::vector
मूल्यों के एक आदेश दिया अनुक्रम है लागू हो सकते हैं करने के लिए std::list
, std::deque
, std::basic_string
, आदि
इसे वेक्टर कहा जाता है क्योंकि मानक टेम्प्लेट लाइब्रेरी के डिजाइनर एलेक्स स्टेपानोव इसे निर्मित सरणियों से अलग करने के लिए एक नाम की तलाश में थे। वह अब स्वीकार करते हैं कि उन्होंने एक गलती की है, क्योंकि गणित पहले से ही संख्या की एक निश्चित-लंबाई अनुक्रम के लिए 'वेक्टर' शब्द का उपयोग करता है। सी ++ 11 इस गलती को एक वर्ग 'सरणी' के रूप में पेश करता है जो गणितीय वेक्टर के समान व्यवहार करता है।
एलेक्स का सबक: हर बार जब आप किसी चीज का नाम लेते हैं तो बहुत सावधान रहें।
C ++ प्रोग्रामिंग लैंग्वेज Bjarne Stroustrup का एक अंश :
"कोई तर्क दे सकता है कि वैलेरे को वेक्टर कहा जाना चाहिए था क्योंकि यह एक पारंपरिक गणितीय वेक्टर है और उस वेक्टर को सरणी कहा जाना चाहिए था । हालांकि, यह शब्दावली विकसित करने का तरीका नहीं है।"
बस यह कहने के लिए कि यह शायद क्यों नहीं कहा जाता है array
: क्योंकि std::vector
एक गतिशील आकार है। एक सरणी वैचारिक रूप से लंबाई में तय की जाती है। अगले C ++ मानक के अनुसार एक std::array
टेम्प्लेट है, जो आकार में तय किया गया है और एक सादे सरणी पर पसंद किया जाना चाहिए:
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
@MarkRuzon से उत्कृष्ट प्रतिक्रिया के पूरक के लिए:
एलेक्स ने कहा कि जिसे अब std :: वेक्टर कहा जाता है, को एक नाम देने के लिए उसने योजना और कॉमन लिस्प नाम को समान डेटा संरचनाओं को दिया था।
बाद में वह मानते हैं कि वह गलत था क्योंकि C ++ वेक्टर का गणित में वैक्टर से कोई लेना-देना नहीं है।
वह यह भी कहता है कि उसने 50 लोगों के समुदाय को 5 मिलियन लोगों के समुदाय में त्रुटि पेश की, इसलिए त्रुटि हमेशा के लिए रहने की संभावना है।
यह सिर्फ नाम है। C ++ वेक्टर बहुत अच्छी तरह से (या शायद अधिक सटीक भी हो सकता है) को डायनामिक ऐरे या रिसाइबल एरे कहा जाता है लेकिन यह नाम केवल चुना गया था । यह वेक्टर मेटामेटिक्स से वेक्टर जैसा नहीं है क्योंकि गणित में वैक्टर किसी भी सेट V के सदस्य होते हैं जैसे कि इस सेट पर दो महत्वपूर्ण ऑपरेशन परिभाषित होते हैं : + (वैक्टर के अलावा) और x (वेक्टर का गुणन क्षेत्र पर एक स्केलर द्वारा एफ ) और ये ऑपरेशन 8 स्वयंसिद्धों को संतुष्ट करते हैं :
जोड़ की संगति
u + (v + w) = (u + v) + w
इसके अलावा कम्यूटेशन
u + v = v + u
इसके अलावा की पहचान तत्व
एक तत्व 0 , V मौजूद है , जिसे शून्य वेक्टर कहा जाता है , जैसे कि v + 0 = v सभी v । V के लिए ।
विलोम के विलोम तत्व
प्रत्येक v every V के लिए, एक तत्व ∈v called V मौजूद होता है , जिसे v का व्युत्क्रम व्युत्क्रम कहा जाता है , जैसे कि v + (+v) = 0
क्षेत्र गुणन के साथ अदिश गुणन की अनुकूलता
a (bv) = (ab) v
अदिश गुणन का पहचान तत्व
1 v = v, जहां 1 F में गुणक पहचान को दर्शाता है ।
वेक्टर जोड़ के संबंध में अदिश गुणन का वितरण
a (u + v) = au + av
क्षेत्र जोड़ के संबंध में अदिश गुणन का वितरण
(a + b) v = av + bv
C ++ std::vector
उन सभी का समर्थन करता है (सीधे नहीं, लेकिन C ++ सुविधाओं के माध्यम से), इसलिए इसे किसी तरह एक वेक्टर कहा जा सकता है, लेकिन यह सिर्फ बोलचाल का है और उदाहरण के लिए "C ++ प्रोग्रामिंग लैंग्वेज"Vallaray
में Bjarne Stroustrup ने बताया है कि वे सीधे कुछ का समर्थन करते हैं।
std::vector
अंकगणितीय संचालन का समर्थन नहीं करता है, और इसलिए, इन सभी गुणों के लिए अपरिभाषित हैं std::vector
। तो एक std::vector
वेक्टर के रूप में योग्य नहीं है। मैंने इसे कॉल किया होगा dynamic_array
या resizable_array
जो आपको बताता है कि यह क्या है।
एक वेक्टर केवल मूल्यों का एक क्रम है, सभी एक ही प्रकार के। यह गणित में उपयोग के अनुरूप बहुत अधिक है। मुझे लगता है कि गणितीय विचार है कि वैक्टर को कुछ सामान्य संचालन का समर्थन करना चाहिए (जैसे जोड़ना, और स्केलर द्वारा स्केलिंग) नहीं किया जाता है, महत्वपूर्ण पहलू मुख्य रूप से संरचना है।
इसके अलावा अगर आप इसे पूर्णांक या फ्लोटिंग पॉइंट स्टोर करते हैं तो यह एन डायमेंशनल वैक्टर को स्टोर करने के लिए एक उत्कृष्ट प्रकार बनाता है। सब के बाद एक वेक्टर है, एक विशिष्ट क्रम में रखी गई संख्याओं की एक सूची है।
0.1
गणित में संग्रहीत करने में सक्षम नहीं होंगी , यह मूल्य वास्तविक संख्याओं के सेट का एक सदस्य है। जावा प्रोग्रामिंग लैंग्वेज ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) में एक वेक्टर है "वेक्टर क्लास ऑब्जेक्ट्स के बढ़ने योग्य एरे को लागू करता है। एरे की तरह, इसमें एक एलीमेंट होता है, जिसमें यह शामिल होता है। एक पूर्णांक सूचकांक का उपयोग करके पहुँचा जा सकता है। हालाँकि, वेक्टर का आकार बढ़ने या हटने के लिए आवश्यकतानुसार छोटा या बड़ा हो सकता है।
बहुत समय पहले, बी भाषा में में वेक्टर प्रकार होते हैं। फिर सी भाषा ने उन्हें "सरण" कहा। तब C वर्ग के साथ और C ++ भाषा ने इसे व्युत्पन्न किया ...
यह निश्चित रूप से पूरी कहानी नहीं है। जैसा कि ऊपर उल्लेख किया गया है, Stepanov ने वास्तविक निर्णय लिया। लेकिन अगर "वेक्टर" अभी भी सी में उपयोग किया गया था, तो परिणाम शायद काफी अलग दिखता है।
पुनश्च। मुझे आश्चर्य है कि सी का नाम "सरणी" क्यों है। सही कारण क्या था?
पीएस 2। C ++ के रूप में एक भाषा के लिए IMO, एक सरणी बेहतर अर्थ है "ऑपरेटर के माध्यम से यथोचित रूप से एक्सेस होने के लिए एक प्रकार का होल्ड एलीमेंट्स" (यानी 42 [some_array_object]) नहीं है, उदाहरण के लिए std का मानचित्रण :: "साहचर्य सरणी" के रूप में।
मुझे लगता है कि यह शब्द पंक्ति वेक्टर से आता है । इसके अलावा, कंप्यूटर वैज्ञानिक चीजों के लिए नए नामों को सोचना पसंद करते हैं ...
लेकिन गणितीय वैक्टर गतिशील नहीं हैं, मैंने कभी भी 2 डी से 3 डी या किसी और चीज में बदलाव नहीं देखा है, अगर कुछ पारंपरिक सरणियां बेहतर वैक्टर के लिए बनाती हैं।
वास्तविक कारण के बारे में कोई विचार नहीं है, लेकिन सी ++ इसे एक सरणी के बजाय एक वेक्टर कह रहा है, सी और सी ++ संरचनाओं के बीच भ्रम को कम करता है, हालांकि वे एक ही भूमिका को पूरा करते हैं।
C ++ वेक्टर को डायनेमिक ऐरे के रूप में सोचें, कौन से साइज़ को एलिमेंट्स डालकर या हटाकर बदला जा सकता है। वे वेक्टर की गणितीय परिभाषा से संबंधित नहीं हैं।
गणित में क्षेत्र
एक nxm
मैट्रिक्स पर विचार करें A
, जहां n
पंक्तियों की संख्या से m
मेल खाती है , और स्तंभों की संख्या से मेल खाती है। एक गणितीय संदर्भ में, एक बार जब आप इस तरह से एक मैट्रिक्स पेश करते हैं, तो बाद में, आप किसी भी ऑपरेशन को A
's' श्रेणी से बाहर नहीं कर सकते हैं और आप इसका A
आकार भी नहीं बढ़ा सकते हैं। इसका मतलब यह है कि आप [n + 1]
और / या के सूचकांक का उल्लेख नहीं कर सकते [m + 1]
।
अब, एक वेक्टर A
इन विशेषताओं को भी व्युत्पन्न करता है, जबकि उनके आयाम हमेशा 1xm
(किसी भी [i]
पंक्ति के भीतर चुने गए A
) या nx1
(किसी भी [j]
स्तंभ के भीतर चयनित A
) होंगे। एक वेक्टर को भी निर्दिष्ट नहीं किया जा सकता है 2xn
, क्योंकि वैक्टर के एक संग्रह को एक वेक्टर के रूप में व्याख्या नहीं किया जा सकता है , जबकि एक वेक्टर - जो आयाम के साथ [i]
कॉलम वेक्टर हो - को एक मैट्रिक्स के रूप में व्याख्या किया जा सकता है।A
1xm
महत्वपूर्ण बात यह है कि आप गणित के संदर्भ में एक बार वेक्टर के आयाम को नहीं बदल सकते।
C ++ में वैक्टर
C ++ में, वैक्टर गणित में वैक्टर की तरह होते हैं, लेकिन गणित के विपरीत उनके आकार में परिवर्तन किया जा सकता है । एक शब्द के रूप में आकार यहां लागू होता है क्योंकि इसका तात्पर्य है तत्व गणना जिसमें एक विशेष वेक्टर शामिल है।
आप C ++ वैक्टर के संदर्भ में शब्द आयाम का उपयोग करते हैं, जब आपके पास वैक्टर का एक वेक्टर होता है std::vector<std::vector<T>>> ragged_array
:। इस उदाहरण में, मैंने उस वेक्टर को "रैग्ड" कहा, क्योंकि यह दर्शाता है कि उस वेक्टर के प्रत्येक वेक्टर के आकार को स्वतंत्र रूप से कैसे बदला जा सकता है। यह न केवल नियमों का उल्लंघन करता है कि गणित में किसी विशेष वेक्टर को पेश करने के बाद आयामों को कैसे बदला नहीं जा सकता है, बल्कि यह भी दर्शाता है कि मैट्रिक्स के रूप में इसका उपयोग कैसे नहीं किया जा सकता है।
आश्चर्य है कि प्रकार पर आधिपत्य नाम करने के लिए करता है ..
यहाँ एक कॉलम ब्लास्ट हो जाता है .. (कुछ सर्वर-साइड ASP.NET HTML एन्कोडिंग कौशल के लिए स्रोत देखें)
या यह एक पंक्ति थी?
फिर फिर, यह MIMD या SSE वेक्टर मशीन संदर्भ में सोच रहा है, नाम अभी भी बहुत अच्छा लग रहा है।