2010-08-08 20 views
21

में ऑटो कीवर्ड मैं जो वेक्टर का उपयोग कोड को देखा है,उपयोग सी ++ एसटीएल

vector<int>s; 
s.push_back(11); 
s.push_back(22); 
s.push_back(33); 
s.push_back(55); 
for (vector<int>::iterator it = s.begin(); it!=s.end(); it++) { 
    cout << *it << endl; 
} 

यह

for (auto it = s.begin(); it != s.end(); it++) { 
    cout << *it << endl; 
} 

कैसे सुरक्षित ऑटो कीवर्ड के उपयोग इस मामले में के रूप में ही है? और अगर वेक्टर का प्रकार float है तो क्या होगा? string?

उत्तर

38

ऑटो कीवर्ड केवल कंपाइलर को प्रारंभिक से चर के प्रकार को कम करने के लिए कह रहा है।

यहां तक ​​कि एक पूर्व-सी ++ 0x कंपाइलर जानता है कि किस प्रकार (प्रारंभिक) अभिव्यक्ति का प्रकार है, और अधिकतर बार, आप उस प्रकार को त्रुटि संदेशों में देख सकते हैं।

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

int main() 
{ 
    vector<int>s; 
    s.push_back(11); 
    s.push_back(22); 
    s.push_back(33); 
    s.push_back(55); 
    for (int it=s.begin();it!=s.end();it++){ 
     cout<<*it<<endl; 
    } 
} 

Line 12: error: cannot convert '__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, __gnu_norm::vector<int, std::allocator<int> > >, __gnu_debug_def::vector<int, std::allocator<int> > >' to 'int' in initialization 

ऑटो कीवर्ड बस आप इस ज्ञान का लाभ लेने के लिए अनुमति देता है - अगर आप (संकलक) सही प्रकार पता है, सिर्फ मेरे लिए चुनते हैं!

+0

मैं विज़ुअल सी ++ 2010 का उपयोग कर रहा हूं, इसलिए मेरे कंपाइलर को ऑटो कीवर्ड –

+0

अच्छी व्याख्या के साथ कोई समस्या नहीं है। +1 – jalf

+3

मैं विशेष रूप से उस 'ऑटो' की तरह एक * हेलुवलॉट * वास्तविक प्रकार से छोटा है। –

11

ऑटो कीवर्ड को = के दाईं ओर अभिव्यक्ति से प्रकार मिलता है। इसलिए यह किसी भी प्रकार के साथ काम करेगा, एकमात्र आवश्यकता ऑटो वैरिएबल को प्रारंभ करने के लिए शुरू करना है ताकि यह घोषित किया जा सके कि संकलक प्रकार को कम कर सकता है।

उदाहरण:

auto a = 0.0f; // a is float 
auto b = std::vector<int>(); // b is std::vector<int>() 

MyType foo() { return MyType(); } 

auto c = foo(); // c is MyType 
+10

पर समस्याग्रस्त हो सकता है हालांकि तकनीकी रूप से सही है। मुझे आशा है कि यह बुरा अभ्यास हो जाएगा। यदि हर कोई सिर्फ अपने सभी चर 'ऑटो' घोषित करता है तो मनुष्यों के पढ़ने और समझने के लिए यह मुश्किल हो जाएगा (और हम बिना शर्त भाषाओं के लिए सड़क का नेतृत्व करते हैं)। ऑटो का उपयोग उन परिस्थितियों के लिए आरक्षित होना चाहिए जहां हम वास्तव में उस प्रकार के बारे में परवाह नहीं करते जब तक कि हम एक ऐसे मानेर में व्यवहार करते हैं जो हम चाहते हैं (उदाहरण के लिए इटरेटर, हम वास्तव में उस परवाह नहीं करते जब तक हम कर सकते हैं इसे एक पुनरावर्तक की तरह प्रयोग करें)। –

+1

@ मार्टिन: कोई मजाक नहीं, पहली बार मैंने 'ऑटो' चर के ब्लॉक को देखा, मैंने सोचा "कृपया तेजी से मरें।" जैसा कि आपने कहा था, इसका उपयोग उन प्रकारों में किया जाना चाहिए, "वेरिएबल, जो भी प्रकार है," परिस्थितियों में, यह नहीं कि "एक चर घोषित करें, और इसके प्रारंभिकता से उसका प्रकार घटाएं!" मुश्किल बकवास होने की कोशिश कर रहा है। – GManNickG

+0

@sverkerw: नहीं। मेरा मतलब है कि मनुष्यों के लिए पढ़ना मुश्किल है। सी का प्रकार क्या है? क्या मुझे जानना है। यह शेष कोड की मेरी व्याख्या को कैसे प्रभावित करता है। –

3

auto कीवर्ड ऐसी स्थिति में उपयोग करने का इरादा है, यह बिल्कुल सुरक्षित है। लेकिन दुर्भाग्य से यह केवल सी ++ 0x में उपलब्ध है, इसलिए आपके पास पोर्टेबिलिटी समस्याएं होंगी।

21

यह अतिरिक्त जानकारी है, और कोई जवाब नहीं है। यहाँ लिखने के लिए लेकिन चूंकि मैं टिप्पणी करने के लिए enought प्रतिष्ठा की जरूरत नहीं है, मैं सिर्फ कर सकते हैं:

सी ++ 11 में आप लिख सकते हैं:

for (auto& it : s) { 
    cout << it << endl; 
} 
बजाय

for (auto it = s.begin(); it != s.end(); it++) { 
    cout << *it << endl; 
} 

इसका एक ही अर्थ है।

अद्यतन: भी @ एल्निटैक की टिप्पणी देखें।

+12

वे समकक्ष नहीं हैं - पहले चर में 'it' प्रकार' value_type' है और वास्तव में एक पुनरावर्तक नहीं है। – Alnitak

+0

मैं इस मामले में 'std :: endl' को' "\ n" 'के साथ बदल दूंगा, फ्लश ऑपरेशन को रोक रहा हूं। [प्रेरणा] (https://stackoverflow.com/questions/213907/c-stdendl-vs-n) – JHBonarius

2

यह भाषा में नया आइटम है जो मुझे लगता है कि हम आने वाले सालों से संघर्ष कर रहे हैं। शुरुआत का 'ऑटो' न केवल पढ़ने योग्यता समस्या प्रस्तुत करता है, अब जब आप इसे सामना करते हैं तो आपको इसे WTF को समझने की कोशिश करने में काफी समय व्यतीत करना होगा (जैसे कि इंटर्न इंटर्न सभी चर xyz :)), लेकिन आप आसानी से उत्साही प्रोग्रामर के बाद काफी समय की सफाई भी करेंगे, जैसे कि मेरे सामने जवाब देने वाले। ऊपर से उदाहरण, मैं $ 1000 शर्त लगा सकता हूं, "के लिए (ऑटो इसे: एस)", नहीं (ऑटो इसे: ") के परिणामस्वरूप, परिणामस्वरूप चलने वाले अर्थशास्त्र को आमंत्रित करते हुए आप इसकी अपेक्षा करते हैं, नीचे संग्रह।

समस्या का एक और उदाहरण आपका प्रश्न ही है।आप स्पष्ट रूप से एसएलएल इटरेटर्स के बारे में ज्यादा नहीं जानते हैं और आप 'ऑटो' के जादू के उपयोग के माध्यम से उस अंतर को दूर करने की कोशिश कर रहे हैं, जिसके परिणामस्वरूप आप कोड बनाते हैं जो

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