মানচিত্রে কোনও কীটির কোনও মান রয়েছে কিনা তা নির্ধারণ করুন?


256

কোনও এসটিএল মানচিত্রে প্রদত্ত কীটির কোনও মান রয়েছে কিনা তা নির্ধারণের সেরা উপায় কী?

#include <map>

using namespace std;

struct Bar
{
    int i;
};

int main()
{
    map<int, Bar> m;
    Bar b = {0};
    Bar b1 = {1};

    m[0] = b;
    m[1] = b1;

    //Bar b2 = m[2];
    map<int, Bar>::iterator iter = m.find(2);
    Bar b3 = iter->second;

}

এটি একটি ডিবাগারে পরীক্ষা করে দেখে মনে হচ্ছে iterএটি কেবল আবর্জনার ডেটা।

যদি আমি এই লাইনটি আপসহীন করি:

Bar b2 = m[2]

ডিবাগার অনুষ্ঠান b2হয় {i = 0}। (আমি অনুমান করছি এটির অর্থ এই যে অনির্ধারিত সূচক ব্যবহার করা সমস্ত খালি / অবিশ্বাস্য মানগুলির সাথে একটি কাঠামো ফেরত দেবে?)

এই পদ্ধতিগুলির কোনওটিই এত দুর্দান্ত নয়। আমি আসলে যা চাই তা হ'ল এটির মত একটি ইন্টারফেস:

bool getValue(int key, Bar& out)
{
    if (map contains value for key)
    {
        out = map[key];
        return true;
    }
    return false;
}

এই লাইন বরাবর কি কিছু বিদ্যমান?


উত্তর:


274

এই লাইন বরাবর কি কিছু বিদ্যমান?

স্টল মানচিত্র শ্রেণীর সাহায্যে, আপনি ::find()মানচিত্রটি অনুসন্ধান করতে ব্যবহার করেছেন এবং প্রত্যাবর্তিত পুনরাবৃত্তিকে এর সাথে তুলনা করুনstd::map::end()

সুতরাং

map<int,Bar>::iterator it = m.find('2');
Bar b3;
if(it != m.end())
{
   //element found;
   b3 = it->second;
}

অবশ্যই আপনি চাইলে আপনার নিজের getValue()রুটিন লিখতে পারেন (সি ++ তেও, ব্যবহারের কোনও কারণ নেই out) তবে আমার সন্দেহ হবে যে একবার আপনি ব্যবহার করার ফাঁস পেয়ে গেলে std::map::find()আপনার সময় নষ্ট হতে চাইবে না।

এছাড়াও আপনার কোডটি কিছুটা ভুল:

m.find('2');একটি মূলমূল্যের জন্য মানচিত্রটি অনুসন্ধান করবে '2'। আইআইআরসি সি ++ সংকলক সুস্পষ্টভাবে '2' কে একটি ইনটে রূপান্তর করবে, যার ফলস্বরূপ '2' এর জন্য এএসসিআইআই কোডের সংখ্যাসূচক মানটি যা আপনি চান তা নয়।

যেহেতু এই উদাহরণটিতে আপনার কী টাইপ হ'ল আপনি এটির intমতো অনুসন্ধান করতে চান:m.find(2);


7
তা কিভাবে? findএর চেয়ে অনেক বেশি ভাল ইঙ্গিত countদেয়। আরও বেশি, countআইটেম ফেরত না। আপনি ওপি প্রশ্নের পড়া, তবে সে existance জন্য চেক করতে, চায় এবং উপাদান ফিরে যান। findএটা করে countনা.
অ্যালান

if (m.count (key)) b3 = m [key]; // বা যাই হোক না কেন
পিকনেল

61
আমি সর্বদা আগ্রহী ছিলাম যে কী ধরনের আগাছা ধূমপান করছিল লোকেরা যারা পুরো স্টল এপিআই নকশা করেছিল।
8:40

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

1
@ ক্লাডিউ সি ++ ২০ ঠিক এটি যোগ করেছে।
pooya13

330

যতক্ষণ না মানচিত্রটি কোনও মাল্টিম্যাপ নয়, সর্বাধিক মার্জিত উপায়গুলির একটি হল গণনা পদ্ধতিটি ব্যবহার করা

if (m.count(key))
    // key exists

উপাদানটি মানচিত্রে উপস্থিত থাকলে গণনা 1 হবে।


22
এটি ইতিমধ্যে একটি কী খুঁজে পাওয়া গেলেও কি এই সমস্ত কীগুলি পরীক্ষা করবে না ? এটি ব্যয়বহুল দ্রুত পেতে পারে ...
মিমদানজিগার

35
এটি কেবলমাত্র একাধিক কী গণনা করবে যদি মাল্টিম্যাপে ব্যবহৃত হয়।
অ্যান্ড্রু প্রোক

14
@ মিমদানজিগার না, এটি ব্যয়বহুল হবে না: cplusplus.com/references/map/map/count গণনা আকারে লোগারিথমিক
jgyou

28
চাবি বিদ্যমান, এবং তারপর কি? এই মুহুর্তে আপনি সাধারণত অন্য কোনও অনুসন্ধানের জন্য অর্থ প্রদানের (উদাহরণস্বরূপ operator[]) এর জন্য মূল্য পেতে চান । findআপনাকে। নেট এর TryGetValueশব্দার্থকতা দেয় যা আপনি (এবং বিশেষত ওপি) যা চান তা প্রায় সর্বদা।
ওহাদ স্নাইডার

2
@serine বোঝা। মনে রাখবেন যে কীটি প্রকাশের ক্ষেত্রে অনুপস্থিত থাকলে আচরণটি ভিন্ন হবে, কারণ মানচিত্র [কী] নতুন সুনির্দিষ্ট-নির্মিত-নির্মিত উপাদানটির মান প্রদান করবে।
ওহাদ স্নাইডার

53

এটি ইতিমধ্যে ঠিক সঠিক বাক্য গঠনতে নয় এটি সন্ধানের সাথে বিদ্যমান।

if (m.find(2) == m.end() )
{
    // key 2 doesn't exist
}

যদি মানটি বিদ্যমান থাকে তবে আপনি এটি অ্যাক্সেস করতে চাইলে আপনি এটি করতে পারেন:

map<int, Bar>::iterator iter = m.find(2);
if (iter != m.end() )
{
    // key 2 exists, do something with iter->second (the value)
}

সি ++ 0 এক্স এবং অটো সহ সিনট্যাক্সটি সহজ:

auto iter = m.find(2);
if (iter != m.end() )
{
    // key 2 exists, do something with iter->second (the value)
}

আমি সুপারিশ করছি এটি সহজ করার জন্য একটি নতুন পদ্ধতি নিয়ে আসার চেষ্টা করার চেয়ে আপনি এতে অভ্যস্ত হয়ে উঠুন। আপনি কোডটি কিছুটা কমিয়ে দিতে সক্ষম হতে পারেন, তবে এটি করার ব্যয়টি বিবেচনা করুন। এখন আপনি একটি নতুন ফাংশন চালু করেছেন যা সি ++ এর সাথে পরিচিত লোকেরা চিনতে সক্ষম হবে না।

আপনি যদি এই সতর্কতা সত্ত্বেও যেকোন উপায়ে এটি প্রয়োগ করতে চান তবে:

template <class Key, class Value, class Comparator, class Alloc>
bool getValue(const std::map<Key, Value, Comparator, Alloc>& my_map, int key, Value& out)
{
    typename std::map<Key, Value, Comparator, Alloc>::const_iterator it = my_map.find(key);
    if (it != my_map.end() )
    {
        out = it->second;
        return true;
    }
    return false;
}

38

আমি কেবল লক্ষ্য করেছি যে সি ++ ২০ এর সাথে আমাদের থাকবে

bool std::map::contains( const Key& key ) const;

মানচিত্র কী সহ কোনও উপাদান ধরে রাখলে তা সত্য হবে key


অবশেষে একটি উত্তর যা এই ফাংশন সম্পর্কে কথা বলে! (সি ++ 20)
স্যামুয়েল রাসকিনহা

শেষ পর্যন্ত? ধন্যবাদ, তবে এটি প্রায় 2 বছর বয়সী! ;-)
kebs


4

এর findবিপরীতে ফেরতের মানটি পরীক্ষা করে দেখুন end

map<int, Bar>::iterator it = m.find('2');
if ( m.end() != it ) { 
  // contains
  ...
}

1

আপনি নিম্নলিখিত কোড সহ আপনার getValue ফাংশন তৈরি করতে পারেন:

bool getValue(const std::map<int, Bar>& input, int key, Bar& out)
{
   std::map<int, Bar>::iterator foundIter = input.find(key);
   if (foundIter != input.end())
   {
      out = foundIter->second;
      return true;
   }
   return false;
}

আমি বিশ্বাস করি লাইনটি 6 হওয়া উচিতout = foundIter->second
দাইনেমাস্টার

আমি কিপ এর উত্তর সংশোধন সঠিকভাবে দেখানোর জন্য out = foundIter->secondবদলেout = *foundIter
netjeff

1

সংক্ষিপ্তভাবে অন্যান্য উত্তরগুলির কয়েকটি সংক্ষিপ্তসার হিসাবে:

আপনি যদি এখনও সি ++ 20 ব্যবহার না করেন তবে আপনি নিজের mapContainsKeyফাংশনটি লিখতে পারেন :

bool mapContainsKey(std::map<int, int>& map, int key)
{
  if (map.find(key) == map.end()) return false;
  return true;
}

আপনি যদি mapবনাম unordered_mapএবং বিভিন্ন কী এবং মান ধরণের জন্য অনেক বেশি ওভারলোড এড়াতে চান তবে আপনি এটি একটি templateফাংশন করতে পারেন ।

আপনি যদি C++ 20বা তার পরে ব্যবহার করেন তবে একটি বিল্ট-ইন containsফাংশন থাকবে:

std::map<int, int> myMap;

// do stuff with myMap here

int key = 123;

if (myMap.contains(key))
{
  // stuff here
}

-1

আপনি যদি মানচিত্রটিতে কোনও কী আছে কিনা তা নির্ধারণ করতে চাইলে আপনি মানচিত্রের সন্ধান () বা গণনা () সদস্য ফাংশনটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ এখানে ব্যবহৃত ফাংশনটি পুনরাবৃত্তিকে উপাদান বা মানচিত্রে ফেরত দেয় :: অন্যথায় শেষ হয়। গণনার ক্ষেত্রে গণনাটি পাওয়া গেলে 1 প্রদান করে, অন্যথায় এটি শূন্য (বা অন্যথায়) প্রদান করে।

if(phone.count(key))
{ //key found
}
else
{//key not found
}

for(int i=0;i<v.size();i++){
    phoneMap::iterator itr=phone.find(v[i]);//I have used a vector in this example to check through map you cal receive a value using at() e.g: map.at(key);
    if(itr!=phone.end())
        cout<<v[i]<<"="<<itr->second<<endl;
    else
        cout<<"Not found"<<endl;
}

-1

বুস্ট মাল্টিনডেক্স সঠিক সমাধানের জন্য ব্যবহার করা যেতে পারে। নিম্নলিখিত সমাধানটি খুব ভাল বিকল্প নয় তবে এমন কয়েকটি ক্ষেত্রে কার্যকর হতে পারে যেখানে ব্যবহারকারী শুরুর সময় 0 বা NULL এর মতো ডিফল্ট মান নির্ধারণ করে এবং মানটি সংশোধিত হয়েছে কিনা তা পরীক্ষা করতে চায়।

Ex.
< int , string >
< string , int > 
< string , string > 

consider < string , string >
mymap["1st"]="first";
mymap["second"]="";
for (std::map<string,string>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
{
       if ( it->second =="" ) 
            continue;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.