এসটিডি :: মাল্টিম্যাপ <কী, মান> এবং এসটিডি :: মানচিত্র <কী, স্ট্যান্ড :: সেট <মূল্য>> এর মধ্যে পার্থক্য কী


উত্তর:


52

মাল্টিম্যাপে জোড়া (কী, মান) যুক্ত থাকে যেখানে কী এবং মান উভয়ই বেশ কয়েকবার প্রদর্শিত হতে পারে।

map<key, set<value>>শুধুমাত্র একটি নির্দিষ্ট কী-এর জন্য একবার প্রতিটি মান সংরক্ষণ করবে। এটি করতে, এটি কেবল কীগুলি নয়, মানগুলির তুলনা করতে সক্ষম হবে।

এটি আপনার প্রয়োগের উপর নির্ভর করে যদি সমান তুলনা করা মানগুলি সমতুল্য হয়, বা আপনি যেভাবে সেগুলি আলাদাভাবে সঞ্চয় করতে চান। সম্ভবত তাদের ক্ষেত্রগুলি পৃথক পৃথক তবে সেটের তুলনায় অংশ নেন না।


4
সুতরাং, একটি এসটিডি :: মাল্টিম্যাপ <কী, মান> একটি স্টাডি :: ম্যাপ <কী, স্টাডি :: মাল্টিসেট <মূল্য>>> এর মতো, তাদের মধ্যে পার্থক্য হ'ল পরবর্তী মানগুলি বাছাই করা। এটা কি সঠিক?
大宝剑

4
না, std::multimap<key, value>একই কীটি একাধিকবার প্রদর্শিত হতে দেয় যেখানে std::map<key, whatever>এর স্বতন্ত্রতা প্রয়োজন key
ইক্যসিং লিউ

75

std::mapহ'ল একটি সাহসী ধারক, এটি আপনাকে আপনার টাইপ মানের সাথে একটি অনন্য কী যুক্ত করতে দেয়। উদাহরণ স্বরূপ,

void someFunction()
{
    typedef std::map<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    auto it = myMap.find("test");
    if (it != myMap.end())
        std::cout << "value for " << it->first << " is " << it->second << std::endl;
    else
        std::cout << "value not found" << std::endl;
}

A std::multimapএর সমান std::map, তবে আপনার কীগুলি আর অনন্য নয়। সুতরাং আপনি কেবল একটি অনন্য আইটেম সন্ধানের পরিবর্তে আইটেমের বিস্তৃত সন্ধান করতে পারেন। উদাহরণ স্বরূপ,

void someFunction()
{
    typedef std::multimap<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("test", 45));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    std::pair<auto first, auto second> range = myMap.equal_range("test");
    for (auto it = range.first; it != range.second; ++it)
        std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}

std::setএকটি মত হল std::map, কিন্তু এটা একটা মান যুক্ত একটি কী সংরক্ষণকারী করা হয় না। এটি কেবলমাত্র মূল ধরণের সঞ্চয় করে এবং আপনাকে আশ্বাস দেয় যে এটি সেটের মধ্যে অনন্য।

আপনারও আছে std::multiset, এটি একই ধাঁচ অনুসরণ করে।

এই সমস্ত পাত্রে তাদের সন্ধান / সমান_আরঞ্জের সাথে একটি ও (লগ (এন)) অ্যাক্সেস সরবরাহ করে।


6
মাল্টিম্যাপ ফাংশনে, এই লাইনটি std::pair<auto first, auto second> range = myMap.equal_range("test");কাজ করে না, কারণ error: 'auto' not allowed in template argumentconst auto range = myMap.equal_range("test")পরিবর্তে ব্যবহার করুন।
ভ্যানসেক্সু

4
মানচিত্রের ধরণ? এটি 4 লাইনে ম্যাপটাইপ হওয়া উচিত নয়?
lolololol

প্রথমে কে ছিলেন তা নিশ্চিত নন, তবে একটি স্পষ্টতই অন্যটির
বৃহত্তম_prime_is_463035818

4
আহা, সিপিপুউজ স্ট্যাকওভারফ্লো স্ক্র্যাপ করছে বা কি ?, আমি এই উত্তরটি কয়েক বছর আগে লিখেছিলাম যখন আমি এখনও সি ++ তে প্রতিদিনের কোডিং করছিলাম। আর প্রকৃতপক্ষে একটি টাইপো লাইন 4 হয়, ধন্যবাদ @lololololol
হয় typedef

4
(এবং তাদের অনুলিপি / পেস্ট ব্যর্থ হয়েছে, তারা এমনকি টেমপ্লেটে স্ট্যান্ডার্ড: মানচিত্রের ঘোষণাপত্র: স্ট্যান্ড :: মানচিত্র <স্ট্যান্ড :: স্ট্রিং, ইন্ট>) তে প্রকার প্রদর্শন করে না
টাইপফেরফ

13
map::insert

কারণ mapপাত্রে ডুপ্লিকেট চাবি মানের জন্য অনুমতি দেয় না, প্রতিটি উপাদানের জন্য সন্নিবেশ অপারেশন চেক সন্নিবেশিত অন্য উপাদান একই কী মান কন্টেইনারে আগে থেকেই আছে কিনা যদি তাই হয়, উপাদান সন্নিবেশিত করা হয় না এবং তার ম্যাপ মান কোন ভাবেই পরিবর্তন করা হয়।

অন্য দিকে

multimap::insert 

একই কী দিয়ে যে কোনও সংখ্যক আইটেম সন্নিবেশ করতে পারে।

http://www.cplsplus.com/references/stl/map/
http://www.cplsplus.com/references/stl/multmap/


উভয় পার্থক্য এবং এটি অভ্যন্তরীণভাবে কীভাবে কাজ করে তার জন্য ভাল লিঙ্ক। লিঙ্ক
Rndp13

10

পরেরটির প্রয়োজন হয় যে মানগুলি অর্ডার করা যায় (হয় operator<বা একটি তুলনা-ফাংশন মাধ্যমে ), পূর্ববর্তীটি তা করে না।


এটি অপারেটর প্রদর্শিত হবে <মানচিত্র বা মাল্টিম্যাপ উভয় একই কাজ? en.cppreferences.com/w/cpp/container/map/operator_cmp
জনবেকার্স

হ্যাঁ, তবে আমার উত্তরটি মানগুলির ক্রমকে বোঝায়। ধরুন আপনার কাছে এমন কোনও টাইপ রয়েছে Tযাতে কোনও অর্ডার নেই। আপনি এটি তৈরিতে ব্যবহার করতে পারেন std::multimap<U, T>, তবে আপনি এটি তৈরিতে ব্যবহার করতে পারবেন না std::map<U, std::set<T> >
বিজার্ন পোলেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.