2012-08-04 15 views
7

cplusplus.com से संदर्भ यह लगता है कि std::set तत्वों को प्रकार देता है।क्या हर मामले में `std :: set` सॉर्ट तत्व है?

मुझे तारों को क्रमबद्ध करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि यह प्रत्येक प्लेटफ़ॉर्म और कंपाइलर पर अच्छा काम करेगा या नहीं। मुख्य रूप से जीसीसी, मिनजीडब्ल्यू, वीसी।

उत्तर

15

इसकी परिभाषा std::set एक क्रमबद्ध कंटेनर है। मानक का इसका हिस्सा। इसे सॉर्ट करने से यह सुनिश्चित होता है कि यह केवल एक मनमाने ढंग से संग्रह के बजाय एक सेट है।

स्रोत: http://www.sgi.com/tech/stl/set.html

+0

'std :: unordered_map' के संदर्भ में 'std :: set' को लागू क्यों नहीं करें, जिसमें ओ (1) सम्मिलन/लुक-अप amortized है? स्रोत के बारे में पढ़ने के लिए –

+0

बहुत आसान है, लिंक के लिए धन्यवाद। –

6

हाँ, std::set भंडार इस तरह से उसके तत्वों है कि तत्वों से अधिक पुनरावृत्ति क्रमबद्ध क्रम में किया जाएगा (और std::adjacent_find करने के लिए कॉल कि std::set भंडार अद्वितीय आइटम के रूप में अच्छी तरह से दिखाने के लिए है)।

#include <algorithm> 
#include <iterator> 
#include <ios> 
#include <iostream> 
#include <set> 
#include <string> 

int main() 
{ 
    auto const ss = std::set<std::string> { "foo", "bar", "test" }; 
    std::cout << std::boolalpha << std::is_sorted(begin(ss), end(ss)) << "\n"; 
    std::cout << std::boolalpha << (std::adjacent_find(begin(ss), end(ss)) == end(ss)) << "\n"; 
    std::copy(begin(ss), end(ss), std::ostream_iterator<std::string>(std::cout, "\n")); 
} 

Live Example

+0

मुझे वास्तव में प्रश्न या उत्तर की परवाह नहीं है, लेकिन मैंने अभी एक नया कमाल सी ++ 11 वाक्यविन्यास सीखा है, इसलिए यह एक अच्छा जवाब है! – Mazyod

+0

@Mazyod Glad आपको यह पसंद आया! मैंने जिस तरह से इसे लिखूंगा, उस उत्तर को अपडेट किया है (कुछ अन्य सी ++ 11 सुविधाओं का उपयोग करके): ऑटो + प्रारंभकर्ता-सूची, गैर-सदस्य 'प्रारंभ() '/' अंत() ', और' प्रतिलिपि ' 'for_each' और lambda के बजाय 'ostream_iterator'। – TemplateRex

10

वास्तव में std :: सेट और std :: नक्शा वास्तव में हल नहीं कर रहे हैं। इन दोनों कंटेनर को red-black trees के रूप में कार्यान्वित किया गया है। तो जब आप इस तरह के कंटेनरों को फिर से शुरू करते हैं, तो इटरेटर इस तरह पेड़ के माध्यम से चलता है कि ऐसा लगता है कि कंटेनर सॉर्ट किया गया है। पहले तो यह सबसे बाईं नोड का दौरा तो सबसे बाईं एक की मूल और इतने पर ...

+1

+1 जानना अच्छा है :) – kravemir

+0

वार्डिंग के अनुसार, http://en.cppreference.com/w/cpp/container/map कहता है: "std :: map एक सॉर्टेड एसोसिएटिव कंटेनर है" –

2

C++11 N3337 standard draft 23.2.4 "साहचर्य कंटेनरों":

1 साहचर्य कंटेनरों तेजी से पुनर्प्राप्ति प्रदान चाबियों के आधार पर डेटा का। पुस्तकालय चार बुनियादी प्रकार के सहयोगी कंटेनर प्रदान करता है: सेट, मल्टीसेट, मानचित्र और मल्टीमैप।

और:

10 साहचर्य कंटेनरों के iterators के मौलिक संपत्ति है कि वे कंटेनरों चाबियों का गैर अवरोही क्रम, जिसमें गैर-उतरते तुलना कि था द्वारा परिभाषित किया गया है में के माध्यम से पुनरावृति है पर उनका निर्माण किया गया।

तो हाँ, आदेश की गारंटी है, जो https://stackoverflow.com/a/11812871/895245 के रूप में मूल रूप से संतुलित खोज वृक्ष कार्यान्वयन की आवश्यकता है।

सी ++ 11 unordered_set के साथ भी इसके विपरीत, जो बेहतर प्रदर्शन प्रदान कर सकता है क्योंकि इसमें कम प्रतिबंध हैं: Why on earth would anyone use set instead of unordered_set? उदा। एक हैश सेट का उपयोग कर।