সন্ধান পদ্ধতিটি ব্যবহার করার পরে কীভাবে std :: মানচিত্র আপডেট করবেন?


90

পদ্ধতিটি std::mapব্যবহারের পরে কী কী মান আপডেট করবেন find?

আমার কাছে একটি মানচিত্র এবং পুনরাবৃত্তি সংক্রান্ত ঘোষণা রয়েছে:

map <char, int> m1;
map <char, int>::iterator m1_it;
typedef pair <char, int> count_pair;

আমি কোনও চরিত্রের উপস্থিতির সংখ্যা সঞ্চয় করতে মানচিত্রটি ব্যবহার করছি।

আমি ভিজ্যুয়াল সি ++ 2010 ব্যবহার করছি।

উত্তর:


130

std::map::findপ্রাপ্ত উপাদানটিকে (বা end()যদি উপাদানটি পাওয়া যায় নি) তবে একটি পুনরাবৃত্তি প্রদান করে । যতক্ষণ mapনা কনস্টেন্ট না থাকে, আপনি পুনরাবৃত্তকারী দ্বারা নির্দেশিত উপাদানটি সংশোধন করতে পারেন:

std::map<char, int> m;
m.insert(std::make_pair('c', 0));  // c is for cookie

std::map<char, int>::iterator it = m.find('c'); 
if (it != m.end())
    it->second = 42;

4
ধন্যবাদ []] অপারেটরটি ব্যবহার করা কি সম্ভব?
জয়কুমার্ক

4
@ জায়ে: হ্যাঁ, তবে আচরণটি আলাদা। দেখুন ডকুমেন্টেশন দ্বারা উপলব্ধ বিভিন্ন কাজকর্মের জন্য । mapmap
জেমস ম্যাকনেলিস

4
আমি পেয়েছি error: assignment of member 'std::pair<char* const, char*>::second' in read-only object:(
টম ব্রিটো

4
@ জয়কুমার্ক আমি হ্যাঁ মনে করি, তবে এই সমাধানটির অসুবিধা হ'ল মানচিত্রে অবশ্যই দ্বিতীয় বারের আইটেমটির অবস্থানটি খুঁজে বার করতে হবে (প্রথম বার আপনার সন্ধানের পদ্ধতিটির কল) যা লগ (এন) জটিলতায় পরিচালিত হয়। এটি একই অপারেশনের অনুলিপি সদৃশ।
সত্য অনুসন্ধানকারী

51

আমি অপারেটরটি ব্যবহার করব []।

map <char, int> m1;

m1['G'] ++;  // If the element 'G' does not exist then it is created and 
             // initialized to zero. A reference to the internal value
             // is returned. so that the ++ operator can be applied.

// If 'G' did not exist it now exist and is 1.
// If 'G' had a value of 'n' it now has a value of 'n+1'

সুতরাং এই কৌশলটি ব্যবহার করে স্ট্রিম থেকে সমস্ত চরিত্র পড়তে এবং সেগুলি গণনা করা সত্যিই সহজ হয়ে যায়:

map <char, int>                m1;
std::ifstream                  file("Plop");
std::istreambuf_iterator<char> end;

for(std::istreambuf_iterator<char> loop(file); loop != end; ++loop)
{
    ++m1[*loop]; // prefer prefix increment out of habbit
}

4
আপনার উত্তরটি আসল প্রশ্নের জন্য দুর্দান্ত - দুঃখের সাথে প্রশ্নকর্তা এটিকে একটি সুস্পষ্ট উপায়ে জিজ্ঞাসা করতে (এবং তাই স্বীকার করবেন) মিস করেছেন। এ কারণেই আমি মনে করি যে এই সত্যটি সম্পর্কে একটি সংক্ষিপ্ত বিবৃতি দেওয়া আরও ভাল হবে: যে লোকেরা খুব দ্রুত "পড়েন", তারা বিশ্বাস করতে পারে যে আপনি ব্যবহারের []পরে ব্যবহারের পরামর্শ দিচ্ছেন find(আমি মনে করি না এটি আপনার উদ্দেশ্য ছিল)।
ওল্ফ

ঠিক আছে, আমি মনে করি যদি কোনও উপাদান অন্তর্নিহিতভাবে sertোকাতে না চায় তবে 'অনুসন্ধান' আরও ভাল হতে পারে । সিগএসইজিভি দ্বারা 'সন্ধান করুন' এবং মরে যাওয়া পছন্দনীয় হতে পারে।
গওয়ানগমু লি

4
@ গয়াংমুলি আই-রেফারেন্সটি end()পুনরুক্তি করা আবশ্যকীয় আচরণ এটির উত্পন্ন করার প্রয়োজন নেই SIGSEGV(এবং আমার অভিজ্ঞতায় এটি করার সম্ভাবনা নেই)।
মার্টিন ইয়র্ক

5

আপনি std::map::atসদস্য ফাংশনটি ব্যবহার করতে পারেন , এটি কী কে দিয়ে চিহ্নিত উপাদানটির ম্যাপ করা মানের একটি রেফারেন্স প্রদান করে।

std::map<char,int> mymap = {
                               { 'a', 0 },
                               { 'b', 0 },
                           };

  mymap.at('a') = 10;
  mymap.at('b') = 20;

1

আপনি যদি ইতিমধ্যে কীটি জানেন তবে আপনি সরাসরি সেই কীটি ব্যবহার করে মানটি আপডেট করতে পারেন m[key] = new_value

এখানে একটি নমুনা কোড যা সাহায্য করতে পারে:

map<int, int> m;

for(int i=0; i<5; i++)
    m[i] = i;

for(auto it=m.begin(); it!=m.end(); it++)
    cout<<it->second<<" ";
//Output: 0 1 2 3 4

m[4] = 7;  //updating value at key 4 here

cout<<"\n"; //Change line

for(auto it=m.begin(); it!=m.end(); it++)
    cout<<it->second<<" ";
// Output: 0 1 2 3 7    

0

আপনি এটির মতোও করতে পারেন-

 std::map<char, int>::iterator it = m.find('c'); 
 if (it != m.end())
 (*it).second = 42;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.