2014-09-22 4 views
6

क्या सी ++ में पाइथन के set.pop() के बराबर है? मैं unordered_set s here के लिए प्रलेखन को देख रहा हूं, लेकिन ऐसा कोई प्रतीत नहीं होता है 1. एक मनमानी तत्व तक पहुंचें, और/या 2. एक्सेस + एक मनमानी तत्व (पॉपिंग) को हटा दें।सी ++ के अनियंत्रित सेट के लिए पायथन के set.pop() के बराबर

+0

चूंकि यह * अनियंत्रित * है, परिभाषा() और अंत() परिभाषा के अनुसार "मनमानी" नहीं है? पाइथन शायद कवर के तहत कुछ ऐसा कर रहा है। – swstephe

+0

सच है ... मैं बस अपने कार्यक्रम के उस कार्यान्वयन के साथ रह सकता हूं। – hlin117

उत्तर

2

ध्यान दें कि सी ++ मानक पुस्तकालय जानबूझकर तैयार किया गया है ताकि विभिन्न कंटेनर विनिर्देशों एक "हो जाते हैं और निकालें" समारोह में शामिल नहीं है: उदाहरण vector के लिए, आपके पास back() है जो अंत में मान देता है, और आपके पास pop_back() है जो अंत में मूल्य को हटा देता है, लेकिन इसे वापस नहीं करता है।

इसके कारण भी एक अलग प्रश्न की सामग्री हो सकते हैं।

तो क्या आप वास्तव में चाहते हैं एक तत्व (जैसे begin() टिप्पणी में सुझाव के रूप में) प्राप्त करने के लिए एक विधि है, और फिर इसे दूर करने के लिए एक बार आप इसे मिल गया है (उदाहरण के लिए erase(iterator) अन्य जवाब में उल्लेख किया)।

+0

मानक द्वारा उस इरादे के कारणों से कोई संदर्भ? –

7

आप पहले तत्व पॉप कर सकते हैं या तो

auto i = *set.begin(); 
set.erase(set.begin()); 

या यदि आप बहुत ज्यादा कार्यान्वयन से परिभाषित बाल्टी के आंतरिक आदेश को लेकर चिंतित हैं (संकेत: आप शायद नहीं होना चाहिए), तो आप एक को दूर कर सकता है

#include <unordered_set> 
#include <iostream> 
#include <random> 

int main() 
{ 
    std::unordered_set<int> set{0, 1, 2, 3, 4, 5}; 
    std::default_random_engine ran{std::random_device{}()}; 

    auto it = set.begin(); 
    std::advance(it, std::uniform_int_distribution<>{0, set.size() - 1}(ran)); 

    std::cout << *it << '\n'; 
    set.erase(it); 
} 
ऊपर

की तरह कुछ के साथ यादृच्छिक तत्व लेकिन विशेष रूप से प्रभावी नहीं है और आप एक std::vector भरने, डुप्लिकेट को दूर करने, आदेश randomizing और फिर बस pop_back elemen ing से बेहतर हो सकता है ts।

#include <algorithm> 
#include <vector> 
#include <iostream> 
#include <random> 

int main() 
{ 
    std::vector<int> vec{0, 1, 2, 3, 3, 4, 5, 5}; 
    std::sort(vec.begin(), vec.end()); 
    vec.erase(std::unique(vec.begin(), vec.end()), vec.end()); 

    std::shuffle(
    vec.begin(), 
    vec.end(), 
    std::default_random_engine{std::random_device{}()} 
); 

    while (!vec.empty()) { 
    std::cout << vec.back() << '\n'; 
    vec.pop_back(); 
    } 
} 

(अपने मंच random_device के आधार पर N.B. एक बहुत अच्छा बीज नहीं हो सकता है)।

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