সি ++ কনট মানচিত্র উপাদান অ্যাক্সেস


101

আমি অপারেটরটি ব্যবহার করার চেষ্টা করেছি [] কনস্টেন্ট সি ++ মানচিত্রে উপাদানটি অ্যাক্সেস করতে, তবে এই পদ্ধতিটি ব্যর্থ হয়েছে। একই জিনিসটি করার জন্য আমি "at ()" ব্যবহার করার চেষ্টাও করেছি। এটি এবার কাজ করেছে। যাইহোক, আমি একটি কনস্ট্রেট সি ++ মানচিত্রে উপাদান অ্যাক্সেস করতে "at ()" ব্যবহার সম্পর্কে কোনও রেফারেন্স পাইনি। "এট ()" সি ++ ম্যাপে নতুন যুক্ত ফাংশন? আমি এই সম্পর্কে আরও তথ্য কোথায় পেতে পারি? আপনাকে অনেক ধন্যবাদ!

একটি উদাহরণ নিম্নলিখিত হতে পারে:

#include <iostream>
#include <map>

using namespace std;

int main()
{
        map<int, char> A;
        A[1] = 'b';
        A[3] = 'c';

        const map<int, char> B = A;

        cout << B.at(3) << endl; // it works
        cout << B[3] << endl;  // it does not work

}

"বি [3]" ব্যবহারের জন্য, এটি সংকলনের সময় নিম্নলিখিত ত্রুটিগুলি ফিরিয়ে দিয়েছে:

t01.cpp: 14: ত্রুটি: 'কনট এসটিডি :: ম্যাপ, এসটিডি :: বরাদ্দকারী>>' কে এই হিসাবে '_Tp & std :: মানচিত্র <_কি, @ পিপি, _কম্পের, _আলোক> :: অপারেটর [] কনস্ট _ কেএ এবং) [_ কী = ইনট্রি, # পিপি = চর, _কম্পার = এসটিডি :: কম, _আলোক = এসটিডি :: বরাদ্দকারী>] 'বাছাই যোগ্যতা

ব্যবহৃত সংকলকটি g ++ 4.2.1

উত্তর:


126

at()std::mapসি ++ 11 এর জন্য একটি নতুন পদ্ধতি ।

operator[]প্রদত্ত কী সহ কোনও উপাদান উপস্থিত না থাকলে যেমন একটি নতুন ডিফল্ট নির্মান উপাদান সন্নিবেশ করানোর পরিবর্তে এটি std::out_of_rangeব্যতিক্রম ছুঁড়ে দেয় । (এই আচরণকে অনুরূপ at()জন্য dequeএবং vector।)

এই আচরণের কারণে এটি constওভারলোড হওয়ার পক্ষে বোঝা তোলে at(), operator[]যা সর্বদা মানচিত্র পরিবর্তন করার সম্ভাবনা রাখে।


ব্যতিক্রম নিক্ষেপের পরিবর্তে "এট" একটি ডিফল্ট মান ফিরে পাওয়া সম্ভব?
ব্যবহারকারী1202136

আমি at()VS203 টুলকিট ব্যবহার করতে একটি প্রকল্পের সেটটিতে VS2013 এ ব্যবহার করছি। আমি ভেবেছিলাম এর অর্থ আমি সি ++ 11 ব্যবহার করছিলাম না ... তবে এটি সংকলন করে ... ??
থমথম

4
আমার কেবল মন্তব্য করতে হবে যে কনস্ট্যান্ট অপারেটর [] বাদ দিতে কোনও মানে হয় না, যা মানচিত্র পরিবর্তন না করে কোনও আনম্যাপড উপাদানটির জন্য একটি ব্যতিক্রমও ফেলতে পারে।
স্পেন্সার

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

আপনি বলতে "শুধুমাত্র অনুমতি বলতে চাইছেন @Brian const জমিদার ব্যতিক্রম নিক্ষেপ করা"?
স্পেনসার

33

যদি কোনও উপাদান একটিতে উপস্থিত না থাকে map, operator []তবে এটি এটিকে যুক্ত করবে - যা সম্ভবত কোনও constমানচিত্রে কাজ করতে পারে না তাই সি ++ constঅপারেটরের কোনও সংস্করণ সংজ্ঞায়িত করে না । এটি সংকলকের ধরণের পরীক্ষক একটি সম্ভাব্য রানটাইম ত্রুটি রোধ করার একটি দুর্দান্ত উদাহরণ।

আপনার ক্ষেত্রে, এর findপরিবর্তে আপনাকে ব্যবহার করতে হবে যা যদি উপস্থিত থাকে তবে এটি কেবলমাত্র (পুনরুদ্ধারকারী) উপাদানটি উপস্থিত করবে, এটি কখনই সংশোধন করবে না map। যদি কোনও আইটেম উপস্থিত না থাকে তবে এটি মানচিত্রের একটি পুনরাবৃত্তি প্রদান করে end()

atউপস্থিত নেই এবং সংকলনও করা উচিত নয়। সম্ভবত এটি একটি "সংকলক এক্সটেনশন" (=)একটি বাগ সি ++ 0 এক্সে নতুন)।


সি ++ স্ট্যান্ডার্ড লাইব্রেরি ক্লাসে অতিরিক্ত অ-মানক সদস্য ফাংশন সংজ্ঞায়িত থেকে প্রয়োগটি নিষিদ্ধ করে?
টিম মার্টিন

@ টিম আমি বিশ্বাস করি ইন্টারফেসটি ঠিক আছে, হ্যাঁ।
কনরাড রুডল্ফ

4

প্রদত্ত কীটি উপস্থিত না থাকলে মানচিত্রটিতে [] -অপটরটি একটি নতুন এন্ট্রি তৈরি করবে । এটি মানচিত্র পরিবর্তন করতে পারে।

এই লিঙ্কটি দেখুন ।


2

এটি আমার কাছে বেশ অবাক হওয়ার মতো বিষয়, তবে এসটিএল মানচিত্রে কোনও constসূচক অপারেটর নেই। অর্থাৎ B[3]কেবল পঠনযোগ্য হতে পারে না। ম্যানুয়াল থেকে:

অপারেটর [] যেহেতু মানচিত্রে একটি নতুন উপাদান sertোকাতে পারে, এটি সম্ভবত কোনও কনস্ট সদস্য সদস্য হতে পারে না।

আমি সম্পর্কে কোন ধারণা আছে at()

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