2016-01-28 4 views
15

मैं एक अस्थायी valarray पर फिर से शुरू करना चाहता हूं, लेकिन यह काम नहीं कर रहा है।सी ++ श्रेणी-आधारित वैलार्रे रावल्यू पर लूप के लिए आधारित नहीं है

#include <iostream> 
#include <valarray> 
int main() 
{ 
     using namespace std; 
     valarray<int> numerators = {99, 26, 25}; 
     valarray<int> denominators = {9, 2, 5}; 
     for (int i : numerators/denominators) { cout << i << ","; } 
     // lots of errors 
     return 0; 
} 

नीचे मैं, प्राप्त करने के लिए, सिवाय इसके कि मैं temp_array की तरह एक वस्तु को परिभाषित नहीं करना चाहती चाहते हैं क्या का एक न्यूनतम काम कर उदाहरण है: यहाँ मेरी (गैर काम कर रहे) कोड है।

#include <iostream> 
#include <valarray> 
int main() 
{ 
     using namespace std; 
     valarray<int> numerators = {99, 26, 25}; 
     valarray<int> denominators = {9, 2, 5}; 
     valarray<int> && temp_array = numerators/denominators; 
     for (int i : temp_array) { cout << i << ","; } 
     // prints 11,13,5, 
     return 0; 
} 

मेरे संकलक जी ++ संस्करण 4.8.5 (रेड हैट 4.8.5-4) है। मैं -std = C++ 0x ध्वज के साथ संकलित कर रहा हूं।

मैंने अन्य वाक्यविन्यास जैसे for (auto&& i : temp_array) और for (int const & i : temp_array) की कोशिश की है, लेकिन यह काम नहीं करता है।

+2

'valarray' के' ऑपरेटर/'वापस जाने के लिए एक प्रॉक्सी वस्तु एक ला अभिव्यक्ति टेम्पलेट्स अनुमति दी है। – chris

+0

मैं स्पष्ट रूप से बहुत लंबे समय तक सी ++ से दूर रहा हूं। क्या कोई बता सकता है कि कैसे 'int (int i: temp_array) {} 'लूप स्टेटमेंट के लिए मान्य है? क्या यह कुछ नहीं होना चाहिए (init; end_condition; increment) '? – user1717828

+0

@ user1717828 लूप के लिए सी ++ 11 की श्रेणी-आधारित देखें। – milleniumbug

उत्तर

11

रूप @Yam Marcovivc's answer में बताया आपरेशन परिणाम एक std::valarray<int> कि सीधे std::begin() को पारित किया जा सकता होने की गारंटी नहीं है। एक अस्थायी निर्माण वस्तु काम कर देता है:

#include <iostream> 
#include <valarray> 
int main() 
{ 
     using namespace std; 
     valarray<int> numerators = {99, 26, 25}; 
     valarray<int> denominators = {9, 2, 5}; 
     for (int i : valarray<int>(numerators/denominators)) { 
      cout << i << ","; 
     } 
     return 0; 
} 

देखें एक Live Demo

18
प्रलेखन से

(जो भी एक ही अभिव्यक्ति में यह करने के लिए आधिकारिक तरीका भी शामिल है):

अन्य कार्यों कि std :: valarray तर्क ले, शुरू() प्रतिस्थापन प्रकार स्वीकार नहीं कर सकते के विपरीत (जैसे अभिव्यक्ति टेम्पलेट्स द्वारा उत्पादित प्रकारों के रूप में) जिन्हें वालरिए से जुड़े अभिव्यक्तियों से वापस किया जा सकता है: std :: start (v1 + v2) पोर्टेबल नहीं है, std :: start (std :: valarray (v1 + v2)) का उपयोग किया जाना चाहिए बजाय।

इस फ़ंक्शन का उद्देश्य लूपों को वैलर के साथ काम करने की अनुमति देना है, कंटेनर अर्थशास्त्र प्रदान नहीं करना।

क्या कारण हो सकता है के रूप में, वहाँ यह भी है (जो @chris द्वारा बताया गया):

[अंकगणितीय ऑपरेटर] वापसी प्रकार std :: valarray से अलग के साथ लागू किया जा सकता ।

तो तकनीकी रूप से यह गारंटी देने के लिए कुछ भी नहीं है कि std::begin पर सुरक्षित रूप से कौन से रिटर्न पास किए जा सकते हैं।

3
for (int i : (valarray<int> &&)(numerators/denominators)) { cout << i << ","; } 
+9

काम करता है, लेकिन सी-स्टाइल कास्ट करने की सिफारिश सबसे अच्छी सलाह नहीं हो सकती है। इसके अलावा किसी और स्पष्टीकरण के बिना कोड पोस्ट करना (और यह अन्य उत्तरों का जिक्र हो) यह एक अच्छा जवाब नहीं देता है। –

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