C++11 के बाद से, std::shuffle() एक प्रतिद्वंद्विता संदर्भ लेता है यादृच्छिक बिट जनरेटर:

template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g);

और इसलिए मैं इसे इस प्रकार कह सकता हूं:

std::vector<int> v = {...};
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g);

यह सी ++ की मेरी समझ में एक त्रुटि प्रकट करता है जिसे मैं आज सुबह पढ़ने के माध्यम से संतुष्ट नहीं कर पाया: यहां एक रावल्यू संदर्भ का उपयोग करके क्या हासिल किया गया है? दूसरे शब्दों में, यह क्यों नहीं है

template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG& g);
13
jma 18 जून 2018, 08:13

1 उत्तर

सबसे बढ़िया उत्तर

यह एक अग्रेषण संदर्भ है, न कि एक प्रतिद्वंद्विता संदर्भ। उनके पास सतही रूप से समान वाक्यविन्यास है लेकिन आधार प्रकार द्वारा घटाए गए टेम्पलेट पैरामीटर के रूप में विभेदित किया जा सकता है।

आपका सुझाया गया विकल्प संकलित नहीं होगा यदि तीसरे तर्क के लिए एक प्रतिद्वंद्विता दी गई थी, जबकि अग्रेषण संदर्भ किसी भी मूल्य श्रेणी के तर्क की अनुमति देता है।

Cppreference उदाहरण का उपयोग करते हुए, इसका मतलब है कि आपके पास दोनों विकल्प हैं:

std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g);

तथा

std::shuffle(v.begin(), v.end(), std::mt19937(rd()));
19
M.M 18 जून 2018, 08:24