Std :: মানচিত্রটি aোকানো না করে কী রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


148

ডুপ্লিকেটগুলি পরীক্ষা করার জন্য আমি খুঁজে পেয়েছি একমাত্র উপায় wayোকানো এবং চেক std::pair.secondকরা false, তবে সমস্যাটি হ'ল কীটি অব্যবহৃত থাকলে এটি এখনও কিছু সন্নিবেশ করে, আমি যা চাই তা একটি map.contains(key);ফাংশন।


উত্তর:


305

ব্যবহার my_map.count( key ) ; এটি কেবল 0 বা 1 প্রদান করতে পারে যা মূলত আপনি চান বুলিয়ান ফলাফল।

পর্যায়ক্রমে my_map.find( key ) != my_map.end()খুব কাজ করে।


40
@ জন: এটি অকাল অপটিমাইজেশনের প্রত্যাশা করে। জিসিসিতে (এবং আমি নিশ্চিত যে বেশিরভাগ যুক্তিসঙ্গত সিস্টেম), map::countহিসাবে এটি প্রয়োগ করা হয় find(__x) == end() ? 0 : 1;। জন্য multimapআপনি একটি কার্যকারিতা যুক্তি থাকতে পারে, কিন্তু যে ওপি এর প্রশ্ন না এবং আমি এখনও কমনীয়তা পছন্দ করে।
পোটোসওয়টার

42
না, অকাল অপটিমাইজেশন যুক্তি কেবলমাত্র বৈধ যদি অপ্টিমাইজেশান কিছু প্রচেষ্টা নেয় যা এই ক্ষেত্রে এটি না করে it
মার্খ 44

13
সত্য না. কোডটি পড়া সহজ করে তোলে বা অপ্রয়োজনীয় ওভারহেড অপসারণ করে তবে এটি অকাল নয়। এই ক্ষেত্রে, যদি গণনা () যাইহোক ফাইন্ড () এর মাধ্যমে প্রয়োগ করা হয়, তবে ফাইন্ড কলিং () সরাসরি একটি ফাংশন কলকে সরিয়ে দেয় ... তবে, এটি পরিপক্ক অপ্টিমাইজেশন। আমি দেখতে পেয়েছি যে ফাইন্ড () কলটি ব্যবহার করা আরও সুস্পষ্ট, তবে এটি নিখুঁতভাবে ব্যক্তিগত পছন্দ।
টিম কেটিং

9
লাইব্রেরি ফাংশনগুলি ব্যবহার করার অভ্যাস করার আগে সচেতন হওয়া কোনও অকালিক অনুকূলতা নয়। এই ক্ষেত্রে, আপনি ঠিক বলেছেন, এটি কোনও ব্যাপার নয়, তবে অনুসন্ধান এবং গণনার মধ্যে বিয়োগচিহ্ন শৈলীগত পার্থক্যও নয়। আমি মনে করি আপনি 'অকাল অপ্টিমাইজেশন' বাণীকে খুব দূরে নিয়ে যান। আপনার যে কোনও "নিখরচায়" অপ্টিমাইজেশন অভ্যাসগুলি গ্রহণ করা উচিত যা আপনি প্রতিদিনের বিকাশের জন্য খুঁজে পেতে পারেন এবং সেগুলি ব্যবহার করতে পারেন। কোডাররা যখন পাঠযোগ্যতা / দেব সময় / ইত্যাদির জন্য মূল্য পরিশোধের ফাঁদে পড়ে যায় তখনই সমস্ত অপ্রত্যাশিত "পারফরম্যান্স লাভ" যা অকাল অপ্টিমাইজেশান বক্তৃতা দেওয়ার সঠিক পরামর্শ হয়ে যায়।
ভয়েডস্টার

10
খুব দূরে, স্ট্যান্ডের গ্রহটিতে থাকা অন্যান্য বুদ্ধিমান মানচিত্র শ্রেণীর মতো একটি জঘন্য has(k)/ যোগ করা উচিত contains(k)। দরিদ্র ইন্টারফেস ডিজাইন। সন্ধান () পদ্ধতিটি খুব ভার্জোজ এবং এপ্রোচটি count(k)অবশ্যই শব্দার্থতত্ত্বের সাথে নয় has(k)। যে বিষয়টি জন্য হয় না find(k)। এই প্রশ্নের ভিউ গণনা পরীক্ষা করে দেখুন।
জারোদ স্মিথ

46

পোটোসওয়টারের উত্তরটি ঠিক আছে তবে আমি ব্যবহার findবা lower_boundতার পরিবর্তে পছন্দ করি । lower_boundবিশেষত দরকারী কারণ প্রত্যাবর্তনকারীটি পরে ইঙ্গিতযুক্ত সন্নিবেশের জন্য ব্যবহার করা যেতে পারে, আপনি কি একই কি দিয়ে কিছু সন্নিবেশ করতে চান?

map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) {    // not found
    // ...
    my_map.insert(iter, make_pair(key, value));     // hinted insertion
} else {
    // ... use iter->second here
}

এটি যেভাবে বলছে যে সে এটি করছে তার থেকে এটি মোটামুটি আলাদা… কেবলমাত্র পার্থক্য হ'ল valueসন্নিবেশ অপ্রয়োজনীয় হলে গণনা বাদ দেওয়া যেতে পারে।
পোটোটোভটার

1
অবশ্যই, আমি বুঝতে পারি যে ওপি to lower_boundোকানো যত্ন করে না, সুতরাং একটি ভিত্তিক সমাধানটি ওভারকিল। আমি কেবল আমার উত্তরটি "সম্পূর্ণতার জন্য" উল্লেখ করেছি; যেমন আমি বলেছিলাম, আপনার পুরোপুরি যথেষ্ট। :-)
ক্রিস জেস্টার-ইয়াং

4
হ্যাঁ, এটি একটি ভাল উত্তর এবং আমি কোনও কিছুর সাথে একমত নই। কেবল insertকোনও প্রাইরির বিকল্পের দিকে সম্পর্কটিকে নির্দেশ করা । আসলে, একটি ব্যবহার করা হয় তবে আরেকটি পার্থক্য নেই multimap, lower_boundপ্লেইন যেহেতু ইকুইভ্যালেন্ট রেঞ্জ শুরুতে পদ্ধতি টিপে insertপদ্ধতি পরিসীমা শেষে যোগ করা হয়েছে।
পোটোসওয়টার

2
প্রশ্নের উত্তর নয়, তবে আমার দুর্বল প্রশ্ন জিজ্ঞাসা করায় আমাকে সঠিক উত্তর এখানে নিয়ে যেতে হবে ... আমাকে সন্নিবেশ / আপডেট করতে হবে। : ডি
হান্টার-অরিওননোয়ার

1
@ হান্টার আপনি কি আমাকে আপনার কোডটি দেখাতে পারবেন? যদি এটি বিশাল না হয় তবে আমি সম্ভবত এটি আপনার জন্য পর্যালোচনা করতে পারি।
ক্রিস জেস্টার-ইয়ং

8

আপনার ডেসিডারেটাম, map.contains(key)স্ট্যান্ডার্ড সি ++ 2 এ খসড়ার জন্য নির্ধারিত । 2017 সালে এটি gcc 9.2 দ্বারা প্রয়োগ করা হয়েছিল । এটি বর্তমান জঞ্জাল মধ্যেও ।


এটি একটি দুর্দান্ত বৈশিষ্ট্য! আমি মনে করি এটি সি ++ ২০ এ পৌঁছেছে। cppreferences.com
ফ্রাঙ্কলিন ইউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.