2015-01-14 11 views
5

क्या सी ++ दुनिया में कोई कंटेनर है जिसमें इन गुण हैं?std :: वेक्टर और std :: सेट गुणों के साथ कंटेनर?

  • तत्वों अद्वितीय और एक अनुकूलन तुलनित्र
  • एक यादृच्छिक अभिगम ऑपरेटर प्रदान की मदद से आदेश दिया है।

मैं वर्तमान में एक std::set<C,COMPARATOR> में मेरी डेटा इकट्ठा करने कर रहा हूँ और बाद में एक std::copy(_set.begin(),_set.end(),std::back_inserter(_vec)) कर आदेश दिया संग्रह करने के लिए रैंडम एक्सेस करने के लिए सक्षम होने के लिए। आकार हालांकि लाखों में जा सकता है।

+0

क्या ढेर मदद करेगा? आपके पास कुल ऑर्डरिंग नहीं होगी, लेकिन अधिकतम तत्व चुनने में सक्षम होंगे। – Quentin

+0

@ क्वांटिन कोई सख्त ऑर्डरिंग आवश्यक नहीं है – Oncaphillis

+2

क्या आप डेटा के मध्य में बहुत से प्रविष्टियां और/या हटाना चाहते हैं? यह स्वीकार्य समाधान में एक बड़ा अंतर बनाने जा रहा है। आपके वर्तमान समाधान को वेक्टर में सीधे जोड़कर और 'std :: sort' चलाकर इसे बेहतर किया जा सकता है, यह कुल मिलाकर थोड़ा तेज़ होना चाहिए। –

उत्तर

7

यदि बूस्ट एक विकल्प है, तो flat_set in the Containers library पर एक नज़र डालें।

flat_set के लिए इंटरफ़ेस std::set के समान है, लेकिन इसे रैंडम एक्सेस iterators प्रदान करता है, std::vector की तरह:

#include <boost/container/flat_set.hpp> 

[...] 

boost::container::flat_set<int> c; 
c.insert(1); 
c.insert(2); 
c.insert(3); 
c.insert(4); 

// unfortunately, no operator[] on the container itself, 
// but the iterator is random access 
int third_element = c.begin()[2]; 

आप मानक पुस्तकालय के साथ फंस रहे हैं, तो आप एक हल कर vector इस उद्देश्य के लिए उपयोग कर सकते हैं। मानक लाइब्रेरी वास्तव में <algorithm> हेडर में बहुत से एल्गोरिदम प्रदान करती है जो आपको set के साथ सॉर्ट किए गए इटरेटर रेंज के साथ बहुत कुछ करने की अनुमति देती है।

+0

मुझे सम्मिलन/हटाने के प्रदर्शन को देखना होगा, लेकिन मुझे लगता है कि यह यह है। बूस्ट निश्चित रूप से एक विकल्प है – Oncaphillis

+1

वे एक यादृच्छिक अभिगम इटरेटर प्रदान करते हैं लेकिन कोई 'ऑपरेटर [] 'नहीं? आश्चर्य है कि इसके लिए तर्क क्या है। – Barry

+1

खैर मैंने 10^6 यादृच्छिक संख्या प्रविष्टियों के साथ एक परीक्षण चलाया था और यह sth लिया। 140 सेकंड की तरह। एक std :: set में सम्मिलन बाद में एक std :: vector में प्रतिलिपि के साथ 1sec के तहत किया गया था। चूंकि मैं प्रारंभिकरण के बाद कई प्रविष्टियां/हटाना नहीं कर रहा हूं, मुझे लगता है कि मैं अपने समाधान के साथ चिपक जाता हूं। हालांकि मैं अभी भी अपने प्रारंभिक प्रश्न के उचित समाधान के रूप में यह उत्तर लेता हूं। – Oncaphillis

1

कोई भी जिसे मैं जानता हूं। हालांकि, लाखों तत्वों और कुछ आदेशों का उपयोग करने के साथ आप अपनी याददाश्त का प्रतिनिधित्व कॉम्पैक्ट और लगातार होना चाहते हैं, जो आपके कंटेनर वर्ग के लिए और भी अधिक आवश्यकताएं हैं।

मैं std::vector के साथ जाऊंगा और आपके द्वारा वर्णित दृष्टिकोण या किसी अन्य सॉर्टिंग एल्गोरिदम का उपयोग करूंगा। आपको शायद अपने std::set की आवश्यकता नहीं होगी, ताकि आप स्मृति को मुक्त कर सकें।

1

मानक सी ++ लाइब्रेरी में नहीं, नहीं। यादृच्छिक पहुंच के लिए या तो vector/deque ऑर्डर करने के लिए आपके पास set/priority_queue है।

लेकिन vector के आसपास अपना खुद का रैपर लिखने से रोकने के लिए कुछ भी नहीं है जो ऑर्डर करने के लिए मजबूर करता है। यह इतना कोड नहीं है। कुछ उदाहरण कार्य:

template <typename T, typename COMP = std::less<T>> 
class sorted_vec { 
    std::vector<T> vec_; 

public: 
    // random access 
    using iterator = typename std::vector<T>::iterator; 
    T& operator[](size_t idx) { return vec_[idx]; } 

    iterator begin() { return vec_.begin(); } 
    iterator end() { return vec_.end(); } 

    // insertion 
    void push(const T& val) { 
     vec_.insert(std::lower_bound(vec_.begin(), vec_.end(), COMP{}), 
        val); 
    } 
}; 
+0

मैं 'टी एंड ऑपरेटर [] 'का' कॉन्स्ट 'संस्करण भी लिखूंगा, ताकि आप' const' संदर्भ से गुज़र सकें। – vsoftco

+0

@ vsoftco दाएं, यह किसी भी तरह से कार्यों की एक विस्तृत सूची नहीं है (उदाहरण के लिए कोई 'const_iterator' आदि नहीं है) – Barry

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