Std :: unordered_map অপারেটর [] অ-উপস্থিতি কীটির জন্য শূন্য-সূচনা করতে পারে?


25

সিপ্রেফারেন্স ডট কম অনুসারে, std::map::operator[]অ-বিদ্যমান মানের জন্য শূন্য-আরম্ভ হয়।

তবে একই সাইট এর জন্য শূন্য-সূচনাকরণের কথা উল্লেখ করে না std::unordered_map::operator[], কেবলমাত্র এটির উপর নির্ভর করে এমন উদাহরণ রয়েছে।

অবশ্যই এটি কেবল একটি রেফারেন্স সাইট, মানক নয়। সুতরাং, নীচের কোডটি ঠিক আছে কি না?

#include <unordered_map>
int main() {
    std::unordered_map<int, int> map;
    return map[42];     // is this guaranteed to return 0?
}

13
@ Æ্লেক্স আপনি কিছু শুরু করার পরে নির্ভরযোগ্যভাবে পরীক্ষা করতে পারবেন না
idclev 463035818

2
@ Æ্লেক্স আমি সত্যিই বুঝতে পারি না, আপনি কীভাবে একটি অ-প্রাথমিকীকরণ করতে পারেন std::optional?
idclev 463035818

2
@ Æ্লেক্স কোনও বস্তুর সূচনা হয় কিনা তা পরীক্ষা করার কোনও উপায় নেই কারণ ইনিশিয়ালাইজেশন ব্যতীত একটি অনির্দেশিত বস্তুর উপর কোনও ক্রিয়াকলাপ অনির্ধারিত আচরণের ফলাফল। একটি std::optionalঅবজেক্ট যা কোনও অন্তর্ভুক্ত মান রাখে না তা এখনও একটি প্রাথমিক বস্তু।
বলভ

2
মান অবজেক্টটি মান-আরম্ভ হয়, শূন্য-আরম্ভ হয় না। স্কেলার প্রকারের জন্য এগুলি একই, তবে শ্রেণীর ধরণের জন্য এগুলি পৃথক।
aschepler

@ বলভ আমি গতকাল gnu 17 এবং std 17 ব্যবহার করে এটি পরীক্ষা করার চেষ্টা করেছি এবং উদ্ভটভাবে আমার যা কিছু পেয়েছিল তা শূন্য সূচনা ছিল initial আমি ভেবেছিলাম std::optional has_valueএটি পরীক্ষা করবে তবে এটি ব্যর্থ হবে, তাই আমি অনুমান করি আপনি সঠিক।
ইলেক্স

উত্তর:


13

যার উপর নির্ভর করে জমিদার আমরা যে বিষয়ে কথা বলছি, std::unordered_map::operator[]সমতূল্য [unord.map.elem]

T& operator[](const key_type& k)
{
    return try_­emplace(k).first->second;
}

(কোনও মূল্য-রেফারেন্স গ্রহণ করা ওভারলোড কেবল সরে kযায় try_emplaceএবং অন্যথায় অভিন্ন)

kমানচিত্রে কী এর অধীনে কোনও উপাদান উপস্থিত থাকলে try_emplaceসেই উপাদানটিতে একটি পুনরাবৃত্তি প্রদান করে এবং false। অন্যথায়, try_emplaceকী এর অধীনে একটি নতুন উপাদান সন্নিবেশ করান k, এবং এটি এবং true [unord.map.modifiers] এ একটি পুনরুক্তি ফেরত দেয় :

template <class... Args>
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);

আমাদের জন্য আকর্ষণীয় হ'ল এখনও কোনও উপাদান নেই [unord.map.modifiers] / 6 :

অন্যথায় প্রকারের value_­typeসাথে নির্মিত একটি বস্তু সন্নিবেশ করানpiecewise_­construct, forward_­as_­tuple(k), forward_­as_­tuple(std​::​forward<Args>(args)...)

(কোনও মূল্য-রেফারেন্স গ্রহণ করা ওভারলোড কেবল সরে kযায় forward_­as_­tupleএবং আবার অন্যথায় অভিন্ন হয়)

যেহেতু value_typeএকটি pair<const Key, T> [unord.map.overview] / 2 , সুতরাং এটি আমাদের জানায় যে নতুন মানচিত্রের উপাদানটি এই হিসাবে নির্মিত হবে:

pair<const Key, T>(piecewise_­construct, forward_­as_­tuple(k), forward_­as_­tuple(std​::​forward<Args>(args)...));

যেহেতু argsআসার সময় খালি তাই operator[], এটি pairকোনও নতুন যুক্তি [جوڑ.pair] / 14 এর সদস্য হিসাবে নির্মিত আমাদের নতুন মূল্যে ফোটে যা সরাসরি প্রারম্ভিককরণ [class.base.init] / 7T ব্যবহার করে টাইপের মান ব্যবহার করে ()ইনিশিয়ালাইজার হিসাবে যা মূল্য সূচনাতে নীচে ফোটে [dcl.init] / 17.4একটির মান সূচনা intহ'ল শূন্য সূচনা [dcl.init] / 8 । এবং একটি intপ্রাকৃতিকভাবে শূন্য সূচনা যা int0 [dcl.init] / 6 এ শুরু করে

হ্যাঁ, আপনার কোডটি 0… ফেরত দেওয়ার গ্যারান্টিযুক্ত


21

আপনি যে সাইটে এটি লিঙ্ক করেছেন তাতে বলা হয়েছে:

যখন ডিফল্ট বরাদ্দকারী ব্যবহৃত হয়, ফলাফলটি কী থেকে অনুলিপি তৈরি করা হবে এবং ম্যাপযুক্ত মানটি মান-আরম্ভ হবে।

সুতরাং intহয় মূল্য সক্রিয়া :

মান আরম্ভের প্রভাবগুলি হ'ল:

[...]

4) অন্যথায়, অবজেক্টটি শূন্য-সূচনাযুক্ত

এ কারণেই ফলাফল হয় 0

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