[] এসটিএল মানচিত্রের জন্য অপারেটর কনস্ট কেন নয়?


90

প্রশ্নের দোহাই দিয়ে তৈরি উদাহরণ:

void MyClass::MyFunction( int x ) const
{
  std::cout << m_map[x] << std::endl
}

এটি সংকলন করবে না, যেহেতু [] অপারেটর নিরপেক্ষ।

এটি দুর্ভাগ্যজনক, যেহেতু [] বাক্য গঠনটি খুব পরিষ্কার দেখাচ্ছে। পরিবর্তে, আমাকে এই জাতীয় কিছু করতে হবে:

void MyClass::MyFunction( int x ) const
{
  MyMap iter = m_map.find(x);
  std::cout << iter->second << std::endl
}

এটি আমাকে সর্বদা জাগিয়ে তুলেছে। []] অপারেটর নন-কনস্ট্যান্ট কেন?


4
operator[]প্রদত্ত উপাদান উপস্থিত না থাকলে কী ফলন করা উচিত ?
ফ্রিরিচ রাবাবে

4
@ ফ্রেরিচ রাবাবে: সদস্যের অনুষ্ঠানে একই জিনিস: নিক্ষিপ্ত স্ট্যান্ড :: আউট_ অফ_আরঞ্জ
জিন-সাইমন ব্রোচু

উত্তর:


91

জন্য std::mapএবং std::unordered_map, operator[]ধারক মধ্যে সূচক মান সন্নিবেশ যদি এটা পূর্বে উপস্থিত করেনি হবে। এটি কিছুটা অনিশ্চিত, তবে এটি এটাই।

যেহেতু এটি অবশ্যই ব্যর্থ হতে হবে এবং একটি ডিফল্ট মান সন্নিবেশ করানো উচিত, তাই অপারেটরটি constধারকটির কোনও উদাহরণে ব্যবহার করা যাবে না ।

http://en.cppreferences.com/w/cpp/container/map/operator_at


4
std::setনেই operator[]
আভাকার

4
এটি সঠিক উত্তর, তবে কোনও কনস্টের সংস্করণ "এট" সদস্য হিসাবে একই কাজ করতে পারে। এটি একটি স্ট্যান্ড ছুড়েছে: আউট_ অফ_রেঞ্জ ...
জিন-সাইমন ব্রোচু

যখন কোনও মান পড়তে ব্যবহৃত হয় তখন সরবরাহের জন্য কোনও ডিফল্ট মান থাকে না। std::vectorএকটি পঠিত অপারেটর আছে []যে constmapএকই কাজ করা উচিত।
wcochran

52

এখন যে সি ++ 11 এর সাথে আপনার () ব্যবহার করে একটি ক্লিনার সংস্করণ থাকতে পারে

void MyClass::MyFunction( int x ) const
{
  std::cout << m_map.at(x) << std::endl;
}

4
যদি mapকনস্ট্যান্ট এবং নন-কনস্ট্যান্ট at()গুলি থাকে - তবে কেন একইরকম নয় operator[]? কনস্ট ভার্সন দিয়ে কিছু butোকানো নয় বরং ছুঁড়ে দেওয়া? (অথবা কোনও
returningচ্ছিক

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

@ আইনপোকলুম খুব দেরীতে, তবে অন্যান্য পাঠকদের জন্য: দুটি অতিরিক্ত ওভারলোড এ জাতীয় বিভিন্ন কাজ করা ভয়ানক হবে। atদুটি স্বাদে একমাত্র কারণটি আসে কারণ এটি একটি করে return *this;এবং ওভারলোডগুলির মধ্যে একমাত্র পার্থক্য হল constরেফারেন্সটির ফিরে আসা ness উভয়ের atএর প্রকৃত প্রভাবগুলি হুবহু একই (এটি কোনও প্রভাব নেই)।
HTNW

28

নতুন পাঠকদের জন্য নোট।
মূল প্রশ্নটি ছিল এসটিএল পাত্রে (বিশেষত স্ট্যান্ড :: ম্যাপ সম্পর্কে নয়)

এটি লক্ষ্য করা উচিত যে বেশিরভাগ ধারকগুলিতে অপারেটরের একটি কনস্টের সংস্করণ রয়েছে]
এটি ঠিক যে স্ট্যান্ড :: ম্যাপ এবং স্টাডি :: সেটের কনস্টের সংস্করণ নেই এবং এটি অন্তর্নিহিত কাঠামোর ফলাফল যা তাদের প্রয়োগ করে।

স্টাড :: ভেক্টর থেকে

reference       operator[](size_type n) 
const_reference operator[](size_type n) const 

এছাড়াও আপনার দ্বিতীয় উদাহরণের জন্য আপনাকে উপাদানটি খুঁজে পেতে ব্যর্থতার জন্য পরীক্ষা করা উচিত।

void MyClass::MyFunction( int x ) const
{
    MyMap iter = m_map.find(x);
    if (iter != m_map.end())
    {
        std::cout << iter->second << std::endl
    }
}

4
std::setমোটেও নেই operator[]
সবাই

2

অপারেটর [] যেহেতু ধারকটিতে একটি নতুন উপাদান sertোকাতে পারে, এটি সম্ভবত কোনও কনস্ট সদস্য সদস্য হতে পারে না। নোট করুন যে অপারেটরের সংজ্ঞাটি অত্যন্ত সহজ: মি [কে] সমান (* ((এম.িনেট্রেট (মান_প্রকার (কে, ডাটা_ টাইপ ())))। দ্বিতীয়))। কড়া কথায় বলতে গেলে এই সদস্যের কাজটি অপ্রয়োজনীয়: এটি কেবলমাত্র সুবিধার জন্য বিদ্যমান


0

একটি সূচক অপারেটর কেবল পঠনযোগ্য পাত্রে (যা সত্যিই প্রতি এসটিএলে বিদ্যমান নেই) জন্য কনস্ট হওয়া উচিত।

সূচক অপারেটরগুলি কেবল মানগুলি দেখার জন্য ব্যবহৃত হয় না।


6
প্রশ্নটি হ'ল কেন এটিতে দুটি ওভারলোডেড সংস্করণ নেই - একটি const, অন্যটি অ const- যেমন যেমন std::vector
পাভেল মিনায়েভ

-2

যদি আপনি আপনার std :: মানচিত্রের সদস্য পরিবর্তনশীলটিকে পরিবর্তনযোগ্য হিসাবে ঘোষণা করেন

mutable std::map<...> m_map;

আপনি আপনার কনস্টের সদস্য ফাংশনের মধ্যে স্ট্যান্ড :: ম্যাপের নন-কনস্ট্যান্ড সদস্য ফাংশনগুলি ব্যবহার করতে পারেন।


15
যদিও এটি একটি ভয়ানক ধারণা।
GManNickG

7
আপনি যদি তা করেন তবে আপনার শ্রেণীর জন্য এপিআই নিখরচায় রয়েছে। ফাংশনটি দাবি করেছে যে এটি কনস্ট্যান্ট - এর অর্থ এটি কোনও সদস্যের ভেরিয়েবলগুলিকে সংশোধন করবে না - তবে বাস্তবে এটি এম_ম্যাপ ডেটা সদস্যকে পরিবর্তন করতে পারে।
Runcible

4
mutablestd::mutexক্যাশে এবং ডিবাগ সহায়কদের মতো সদস্যদের জন্য ব্যবহার করা যেতে পারে । যদি খুব ব্যয়বহুল const"গেটর" ফাংশনটি গতিতে মানচিত্রটিকে ক্যাশে হিসাবে ব্যবহার করতে হয় তবে mutableতা গ্রহণযোগ্য। আপনার সাবধান হওয়া দরকার, তবে এটি নিজে থেকে কোনও ভয়ঙ্কর ধারণা নয়।
Lakata
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.