std::map<int, std::vector<int>> tmp_map = { { 1, [10,5,4] }, { 2, [5,5,1] },
        { 3, [2,4,3] }, { 4, [9,7,8] } };

मैं इस मानचित्र को वेक्टर मान में तीसरे मान से ऑर्डर करना चाहता हूं। तो परिणाम इस प्रकार होगा:

{ { 2, [5,5,1] },{ 3, [2,4,3] },{ 1, [10,5,4] },{ 4, [9,7,8] } }
c++
0
유 길재 23 अप्रैल 2020, 08:24
1
std::sort कस्टम तुलना फंक्शन की अनुमति देता है।
 – 
tadman
23 अप्रैल 2020, 08:25
क्षमा करें क्या आप अधिक विशिष्ट हो सकते हैं?
 – 
유 길재
23 अप्रैल 2020, 08:26
4
मानचित्रों को उनकी चाबियों द्वारा क्रमबद्ध किया जाता है, इस तरह वे काम करते हैं। तो जिस तरह से आप चाहते हैं उस डेटा को सॉर्ट करने के लिए आपको इसे एक अलग डेटा संरचना में कॉपी करना होगा, उदाहरण के लिए जोड़े के वेक्टर।
 – 
john
23 अप्रैल 2020, 08:27
एक कस्टम तुलनित्र के साथ आप किसी भी मानदंड से कुछ भी छाँट सकते हैं, कुछ चेतावनियों के अधीन। आप नए सी ++ संस्करणों में लैम्ब्डा का भी उपयोग कर सकते हैं। जैसा कि जॉन कहते हैं, इसे एक वेक्टर में बदलें, फिर इसे सॉर्ट करें।
 – 
tadman
23 अप्रैल 2020, 08:28
या आप कुंजी और मूल्य को चारों ओर स्वैप कर सकते हैं और अपने स्वैप किए गए मानचित्र में एक कस्टम तुलनित्र का उपयोग कर सकते हैं। या यदि आप दोनों ऑर्डर एक साथ चाहते हैं तो आप बूस्ट का उपयोग कर सकते हैं multiindex
 – 
john
23 अप्रैल 2020, 08:35

2 जवाब

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

मानक दृष्टिकोण। . .

  • मानचित्र को वेक्टर में कॉपी करें
  • कस्टम तुलनित्र के साथ सॉर्ट वेक्टर
#include <iostream>
#include <map>
#include <vector>
#include <utility>
#include <algorithm>

int main() {
    std::map<int, std::vector<int>> tmp_map = { { 1,{10,5,4} }, { 2,{5,5,1} },
        { 3,{2,4,3} }, { 4,{9,7,8} } };

    // For easier and shorter writing
    using DataType = std::pair<int, std::vector<int>>;

    // Create Vector with Elements from Map
    std::vector<DataType> data(tmp_map.begin(), tmp_map.end());

    // Sort data
    std::sort(data.begin(), data.end(), [](const DataType& d1, const DataType& d2) { return d1.second[2] < d2.second[2]; });

    // show result
    for (const auto& [key, value] : data) {
        std::cout << key << "  -->  ";
        for (const int i : value) std::cout << i << " ";
        std::cout << "\n";
    }
    return 0;
}
2
Armin Montigny 23 अप्रैल 2020, 08:41

आप map पहले से ही इसके मुख्य मान के अनुसार क्रमबद्ध हैं, इसलिए आप इसे अपने स्थान पर पुन: व्यवस्थित नहीं कर सकते। इसके बजाय आपको क्या करना चाहिए इसे एक वेक्टर में कॉपी करें और फिर इसे इस तरह एक कस्टम ऑपरेटर का उपयोग करके सॉर्ट करें:

#include <map>
#include <vector>
#include <algorithm>

int main()
{
    std::map<int, std::vector<int>> tmp_map = { { 1, {10,5,4} }, { 2, {5,5,1} },
        { 3, {2,4,3} }, { 4, {9,7,8} } };

    //! Copy the map
    using P = std::pair<int, std::vector<int>>;
    std::vector<P> copy(tmp_map.begin(), tmp_map.end());

    //! Sort it the way you want (here I'm sorting on based on the second element
    //! of the array.
    std::sort(copy.begin(), copy.end(), [](const P& a, const P& b)
    {
        return a.second[2] < b.second[2];
    });
}
2
Thomas Caissard 23 अप्रैल 2020, 08:42