ভেক্টর :: বনাম ভেক্টর :: অপারেটর []


95

আমি জানি যে এটির সীমানা যাচাইয়ের at()চেয়ে ধীর গতির [], যা সি ++ ভেক্টর এ / [] অপারেটরের গতি বা :: এসটিডি :: ভেক্টর :: এ () বনাম অপারেটর [] << অবাক করা ফলাফলের মতো একই প্রশ্নেও আলোচনা করা হয়েছে !! 5 থেকে 10 গুণ ধীর / দ্রুত! at()পদ্ধতিটি কী ভাল তা আমি ঠিক বুঝতে পারি না ।

আমার মতো যদি এইর মতো সরল ভেক্টর থাকে: std::vector<int> v(10);এবং আমি যখন সূচক রাখি তখন পরিস্থিতির at()পরিবর্তে ব্যবহার করে এর উপাদানগুলি অ্যাক্সেস করার সিদ্ধান্ত []নিয়েছি iএবং আমি নিশ্চিত নই যে এটির ভেক্টর সীমানায় রয়েছে কিনা, এটি আমাকে চেষ্টা করে এটি আবদ্ধ করতে বাধ্য করে ব্লক :

try
{
    v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
    ...
}

যদিও আমি size()নিজেই সূচকটি ব্যবহার করে এবং পরীক্ষা করে একই আচরণটি করতে সক্ষম হয়েছি যা আমার পক্ষে সহজ এবং বেশ সুবিধাজনক বলে মনে হচ্ছে:

if (i < v.size())
    v[i] = 2;

সুতরাং আমার প্রশ্নটি হল: ভেক্টর :: ওভার ভেক্টর :: অপারেটর []
ব্যবহার করার সুবিধা কী ?
আমার কখন ভেক্টর ব্যবহার করা উচিত :: ভেক্টরের পরিবর্তে :: আকার + ভেক্টর :: অপারেটর [] ?


11
+1 খুব ভাল প্রশ্ন !! তবে আমি মনে করি না () এগুলি সাধারণত ব্যবহৃত হয়।
রোহিত ভিপিন ম্যাথিউজ

10
মনে রাখবেন যে আপনার উদাহরণ কোডে, if (i < v.size()) v[i] = 2;একটি সম্ভাব্য কোড পাথ রয়েছে যা 2কোনও উপাদানকেই বরাদ্দ করে না v। যদি এটি সঠিক আচরণ হয়, দুর্দান্ত। তবে প্রায়শই বোধগম্য কিছু নেই যা এই ফাংশনটি করতে পারে i >= v.size()। সুতরাং এটির কোনও অপ্রত্যাশিত পরিস্থিতি নির্দেশ করার জন্য কোনও ব্যতিক্রম ব্যবহার করা উচিত নয় বলে কোনও বিশেষ কারণ নেই । অনেকগুলি ক্রিয়াকলাপের operator[]আকার, ডকুমেন্টের বিরুদ্ধে কোনও চেক ছাড়াই কেবল ব্যবহার iকরে এবং ফলাফলকারী ইউবিকে কলারের উপরে দোষ দেয়।
স্টিভ জেসোপ

উত্তর:


74

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


4
+1 আমি কীভাবে ভুল ব্যবহারকারীর ইনপুট হ্যান্ডলিং আলাদা করতে হবে (ইনপুট বৈধতা; অবৈধ ইনপুট আশা করা যেতে পারে তাই এটি ব্যতিক্রমী কিছু হিসাবে বিবেচনা করা হয় না) ... এবং কোডে বাগগুলি (সীমার বাইরে থাকা পুনরুদ্ধারকারীকে ডিফেরেন্সিং ব্যতিক্রমী) জিনিস)
বোজন কোমাজেক

তাই আপনি বলতে যে, আমি ব্যবহার করা উচিত size()+ + []যখন সূচক ব্যবহারকারীদের ইনপুট, ব্যবহারের উপর নির্ভর করে assertপরিস্থিতিতে যেখানে সূচক ভবিষ্যতে এবং সহজ বাগ ফিক্সিংয়ের জন্য সীমার বাইরে কখনোই হওয়া উচিত .at()অন্য সব পরিস্থিতিতে (ঠিক ক্ষেত্রে, কারণ কিছু ভুল ঘটতে পারে .. ।)
LihO

8
@ লিহো: যদি আপনার প্রয়োগটি একটি ডিবাগিং বাস্তবায়ন প্রস্তাব করে vectorতবে সম্ভবত সর্বত্রের পরিবর্তে "কেবল ক্ষেত্রে" বিকল্প হিসাবে এটি ব্যবহার করা ভাল at()। এইভাবে আপনি রিলিজ মোডে আরও কিছুটা পারফরম্যান্সের জন্য আশা করতে পারেন, যদি আপনার কখনও প্রয়োজন হয়।
স্টিভ জেসোপ

4
হ্যাঁ, বেশিরভাগ এসটিএল বাস্তবায়ন আজকের দিনে এমন একটি ডিবাগ মোডকে সমর্থন করে যা এমনকি চেকও করে দেয়operator[] যেমন, gcc.gnu.org/onlinesocs/libstdc++/manual/… সুতরাং যদি আপনার প্ল্যাটফর্মটি এটি সমর্থন করে, আপনি সম্ভবত এটির সাথে চলে যাবেন!
pmdj

4
@ পিএমডিজে চমত্কার পয়েন্ট, যা সম্পর্কে আমি জানতাম না ... তবে অনাথ লিঙ্ক। : পি বর্তমান একটি: gcc.gnu.org/onlinesocs/libstdc++/manual/debug_mode.html
আন্ডারস্কোর_ডে

16

এটি আমাকে চেষ্টা-ব্লক দিয়ে মুড়িয়ে দিতে বাধ্য করে

না এটি হয় না (চেষ্টা / ধরার ব্লকটি উজানের দিকে প্রবাহিত হতে পারে)। আপনি যখন আপনার প্রোগ্রামটিকে অপরিজ্ঞাত আচরণের ক্ষেত্রের ভিতরে প্রবেশ করার পরিবর্তে কোনও ব্যতিক্রম নিক্ষেপ করতে চান তখন এটি কার্যকর হয়।

আমি সম্মত হই যে ভেক্টরগুলিতে সীমাবদ্ধতা অ্যাক্সেসের বাইরে বেশিরভাগই একটি প্রোগ্রামারের ভুল (এই ক্ষেত্রে আপনাকে assertসেই ভুলগুলি আরও সহজে চিহ্নিত করার জন্য ব্যবহার করা উচিত ; স্ট্যান্ডার্ড লাইব্রেরির বেশিরভাগ ডিবাগ সংস্করণ এটি আপনার জন্য স্বয়ংক্রিয়ভাবে করে থাকে)। আপনি প্রোগ্রামার ভুলগুলি প্রতিবেদন করতে প্রবাহকে গ্রাস করা যায় এমন ব্যতিক্রমগুলি ব্যবহার করতে চান না: আপনি বাগটি ঠিক করতে সক্ষম হতে চান ।

যেহেতু ভেক্টরের অ্যাক্সেসের বাইরে থাকা স্বাভাবিক প্রোগ্রাম প্রবাহের অংশ হিসাবে এটি সম্ভাবনা নেই (ক্ষেত্রে এটি ঠিক আছে: sizeব্যতিক্রমটি বুদবুদ না দেওয়ার পরিবর্তে আগেই পরীক্ষা করুন ), তাই আমি আপনার ডায়াগোনস্টিকের সাথে একমত: atমূলত অকেজো।


আমি যদি out_of_rangeব্যতিক্রম না ধরি তবে abort()তাকে বলা হয়।
LihO

@ লিহো: অগত্যা নয় ... try..catchএই পদ্ধতিটিতে যে পদ্ধতিটি ডাকা হচ্ছে এটি উপস্থিত থাকতে পারে।
নবীন

12
অন্য কিছুই পারেন, atযতটুকু আপনি অন্যথায় এটি হবে নিজেকে ভালো কিছু লেখার জন্য দরকারী if (i < v.size()) { v[i] = 2; } else { throw what_are_you_doing_you_muppet(); }। লোকেরা প্রায়শই "অভিশাপগুলির শর্তাবলী, আমাকে ব্যতিক্রম হ্যান্ডেল করতে হবে" এর শর্তে ব্যতিক্রম নিক্ষেপকারী ক্রিয়াকলাপের কথা ভাবেন, তবে যতক্ষণ আপনি আপনার প্রতিটি ফাংশন নিক্ষেপ করতে পারে তা সাবধানতার সাথে নথিভুক্ত করার পরে সেগুলি "দুর্দান্ত হিসাবেও ব্যবহার করা যেতে পারে, আমি না একটি শর্ত পরীক্ষা করতে হবে এবং একটি ব্যতিক্রম নিক্ষেপ করতে হবে "।
স্টিভ জেসোপ

@ স্টিভ জেসাপ: আমি প্রোগ্রাম বাগের ব্যাতিক্রম ছুঁড়ে দেওয়া পছন্দ করি না, যেহেতু তারা অন্যান্য প্রোগ্রামারদের দ্বারা প্রবাহিত হতে পারে। জোর দেওয়া এখানে অনেক বেশি দরকারী।
আলেকজান্দ্রি সি

6
@ অ্যালেক্সানড্রেসি ভাল, out_of_rangeএটির সরকারী প্রতিক্রিয়া হ'ল এটি থেকে প্রাপ্ত logic_errorএবং অন্যান্য প্রোগ্রামারদের " logic_errorউজানগুলি ধরার চেয়ে সেগুলি উপেক্ষা করার চেয়ে" আরও ভাল জানা উচিত । assertযদি আপনার সহকর্মীরা তাদের ভুলগুলি সম্পর্কে জানতে না আগ্রহী হন তবে তা এড়ানোও যায়, এটি কেবল আরও শক্ত কারণ তাদের; কোড সহ আপনার কোডটি সংকলন করতে হবে; NDEBUGপ্রত্যেকটি ব্যবস্থার নিজস্ব গুণাবলী এবং ত্রুটি রয়েছে।
স্টিভ জেসোপ

11

ভেক্টর :: ওভার ভেক্টর :: অপারেটর [] এ ব্যবহার করার সুবিধা কী? আমার কখন ভেক্টর ব্যবহার করা উচিত :: ভেক্টরের পরিবর্তে :: আকার + ভেক্টর :: অপারেটর []?

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

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

বাস্তব-জগতের উদাহরণ হিসাবে, আমার কাছে কোড রয়েছে যা সি ++ কে লেক্সিক্যাল উপাদানগুলিতে টোকেনাইজ করে, তারপরে অন্যান্য কোড যা টোকেনের ভেক্টরের উপরে একটি সূচককে সরায়। যা ঘটেছিল তার উপর নির্ভর করে, আমি পরবর্তী উপাদানগুলিকে বৃদ্ধি এবং চেক করতে চাই:

if (token.at(i) == Token::Keyword_Enum)
{
    ASSERT_EQ(tokens.at(++i), Token::Idn);
    if (tokens.at(++i) == Left_Brace)
        ...
    or whatever

এই ধরণের পরিস্থিতিতে, আপনি সঠিকভাবে ইনপুটটির শেষে পৌঁছেছেন কিনা তা পরীক্ষা করা খুব কঠিন কারণ এটি যে সঠিক টোকেনগুলির মুখোমুখি হয়েছিল তার উপর নির্ভরশীল। ব্যবহারের প্রতিটি পয়েন্টে সুস্পষ্ট চেকিং বেদনাদায়ক, এবং প্রিমার / পোস্ট ইনক্রিমেন্ট, ব্যবহারের পয়েন্টে অফসেট, কিছু পূর্ববর্তী পরীক্ষার অব্যাহত বৈধতা সম্পর্কে ত্রুটিযুক্ত যুক্তি ইত্যাদি হিসাবে প্রোগ্রামার ত্রুটির আরও অনেক জায়গা রয়েছে kick


10

at আপনার যদি ভেক্টরের কাছে কোনও পয়েন্টার থাকে তবে তা পরিষ্কার হয়ে যেতে পারে:

return pVector->at(n);
return (*pVector)[n];
return pVector->operator[](n);

পারফরম্যান্স একদিকে রেখে, এর মধ্যে প্রথমটি হল সহজ এবং পরিষ্কার কোড।


... বিশেষত যখন আপনার কোনও ভেক্টরের এন- তম উপাদানটির পয়েন্টার দরকার হয় ।
ডলফিন

4

প্রথমত, কিনা at()বা operator[]ধীর নিদিষ্ট নয়। যখন কোনও সীমাবদ্ধ ত্রুটি নেই, আমি কমপক্ষে ডিবাগিং বিল্ডগুলিতে, তাদের একই গতি সম্পর্কে আশা করব। পার্থক্যটি হ'ল at()একটি সীমানা ত্রুটি (একটি ব্যতিক্রম) সেখানে ঠিক কী ঘটবে তা নির্দিষ্ট করে, যেখানে যেমন operator[]এটি অপরিজ্ঞাত আচরণ — আমি ব্যবহার করি এমন সমস্ত সিস্টেমে ক্রাশ (জি ++ এবং ভিসি ++), কমপক্ষে যখন সাধারণ ডিবাগিং পতাকা ব্যবহার করা হয়। (আর একটি পার্থক্য হ'ল একবার আমি আমার কোড সম্পর্কে নিশ্চিত হয়ে গেলে, আমি operator[] ডিবাগিংটি বন্ধ করে দিয়ে যথেষ্ট গতি বৃদ্ধি পেতে পারি the যদি পারফরম্যান্সের প্রয়োজন হয় it এটি প্রয়োজনীয় না হলে আমি এটি করতাম না))

অনুশীলনে, at()খুব কমই উপযুক্ত। যদি প্রসঙ্গটি এমন হয় যে আপনি জানেন যে সূচকটি অবৈধ হতে পারে তবে আপনি সম্ভবত স্পষ্ট পরীক্ষাটি চান (উদাহরণস্বরূপ একটি ডিফল্ট মান বা কোনও কিছু ফিরিয়ে দিতে), এবং যদি আপনি জানেন যে এটি অবৈধ হতে পারে না, তবে আপনি বাতিল করতে চান (এবং যদি এটি অবৈধ বা নাও হতে পারে তা আপনি জানেন না, আমি প্রস্তাব দেব যে আপনি আপনার ফাংশনের ইন্টারফেসটি আরও সুনির্দিষ্টভাবে নির্দিষ্ট করুন)। কিছু ব্যতিক্রম আছে, তবে যেখানে অবৈধ সূচকটি ব্যবহারকারীর ডেটা বিশ্লেষণের ফলস্বরূপ হতে পারে এবং ত্রুটিটি পুরো অনুরোধটি বাতিল করতে পারে (তবে সার্ভারটি নামিয়ে আনবে না); এই ক্ষেত্রে, একটি ব্যতিক্রম উপযুক্ত এবং at()আপনার জন্য এটি করবে।


4
আপনি কেন তাদের একই গতি সম্পর্কে প্রত্যাশা করবেন, যখন operator[]সীমানা-চেক করতে বাধ্য করা হয় না, কোথায় at()? আপনি কি সেই বোঝা ক্যাচিং, জল্পনা এবং শাখা-প্রশাখা বাফার সমস্যাগুলি দ্বারা চালিত হন?
সেবাস্তিয়ান মাচ

4
দুঃখিত, আপনার "ডিবাগিং মোডে" -সতুমরণ মিস হয়েছে। তবে, আমি ডিবাগ মোডে এর মানের কোডটি পরিমাপ করব না। রিলিজ মোডে, চেকিং কেবলমাত্র প্রয়োজনীয় at()
সেবাস্তিয়ান মাচ

4
@ ফ্রেসনেল আমি বিতরণ করেছি বেশিরভাগ কোড "ডিবাগ" মোডে। যখন পারফরম্যান্সের সমস্যাগুলি আসলে এটির প্রয়োজন হয় তখন আপনি কেবল পরীক্ষা বন্ধ করে দেন। (মাইক্রোসফ্ট প্রাক-2010 এখানে কিছুটা সমস্যা ছিল, যেহেতু std::stringযদি চেকিং বিকল্পগুলি রানটাইমের সাথে সামঞ্জস্য না করে তবে সবসময় কাজ করে না: -MDএবং আপনি আরও ভালভাবে চেকিং বন্ধ করে দিতেন -MDdএবং আপনি আরও ভাল এটি চালু আছে))
জেমস কানজে

4
আমি শিবিরের মধ্যে আরও বেশি কিছু বলি যে "স্ট্যান্ডার্ড অনুসারে কোড অনুমোদিত (গ্যারান্টিযুক্ত)"; অবশ্যই আপনি ডিবাগ মোডে বিতরণ করতে পারেন তবে ক্রস প্ল্যাটফর্ম বিকাশ করার সময় (একই সাথে ওএসের ক্ষেত্রে নয়, তবে আলাদা আলাদা সংকলক সংস্করণ অন্তর্ভুক্ত রয়েছে) স্ট্যান্ডার্ডের উপর নির্ভর করা রিলিজের জন্য সেরা বাজি এবং ডিবাগ মোড is প্রোগ্রামারকে সেই জিনিসটি বেশিরভাগ ক্ষেত্রে সঠিক এবং শক্তিশালী করার জন্য একটি সরঞ্জাম হিসাবে বিবেচনা করা হয় :)
সেবাস্তিয়ান ম্যাচ

4
অন্যদিকে, যদি আপনার অ্যাপ্লিকেশনটির সমালোচনামূলক অংশগুলি যেমন ব্যতিক্রমী সুরক্ষা (RAII ftw) দ্বারা বিচ্ছিন্ন এবং সুরক্ষিত হয়, তবে প্রতিটি অ্যাক্সেস operator[]পঙ্গু হওয়া উচিত ? যেমন std::vector<color> surface(witdh*height); ...; for (int y=0; y!=height; ++y)...,। আমি মনে করি বিতরণ বাইনারিগুলিতে সীমা পরীক্ষা করা কার্যকর করা অকাল হতাশার অধীনে। তবে, এটি কেবলমাত্র ইঞ্জিনিয়ারড নয় এমন কোডের জন্য ব্যান্ড এইড হওয়া উচিত।
সেবাস্তিয়ান মাচ

1

ব্যতিক্রমগুলি ব্যবহার করার পুরো বিষয়টিটি হ'ল আপনার ত্রুটি পরিচালনার কোডটি আরও দূরে হতে পারে।

এই নির্দিষ্ট ক্ষেত্রে, ব্যবহারকারীর ইনপুট প্রকৃতপক্ষে একটি ভাল উদাহরণ। আপনি কোনও এক্সএমএল ডেটা স্ট্রাকচারকে শব্দার্থগতভাবে বিশ্লেষণ করতে চান তা কল্পনা করুন যা কোনও অভ্যন্তরীণভাবে আপনি অভ্যন্তরীণভাবে সঞ্চয় করেন এমন কোনও ধরণের সংস্থানকে নির্দেশ করতে সূচকগুলি ব্যবহার করে std::vector। এখন এক্সএমএল ট্রি একটি গাছ, সুতরাং আপনার সম্ভবত এটি বিশ্লেষণের জন্য পুনরাবৃত্তি ব্যবহার করতে চান। গভীরভাবে ডাউন, পুনরাবৃত্তিতে, এক্সএমএল ফাইলটির লেখক দ্বারা অ্যাক্সেস লঙ্ঘন হতে পারে। সেক্ষেত্রে আপনি সাধারণত পুনরাবৃত্তির সমস্ত স্তর থেকে বেরিয়ে আসতে এবং পুরো ফাইলটি (বা কোনও ধরণের "মোটা" কাঠামো) প্রত্যাখ্যান করতে চান। এখানেই কাজে আসে। ফাইলটি বৈধ কিনা আপনি কেবল বিশ্লেষণ কোডটি লিখতে পারেন। লাইব্রেরি কোডটি ত্রুটি সনাক্তকরণের যত্ন নেবে এবং আপনি কেবল ত্রুটিটি মোটা স্তরে ধরতে পারবেন।

এছাড়াও, অন্যান্য পাত্রে, যেমনগুলির std::mapমধ্যেও std::map::atএর সামান্য আলাদা শব্দার্থক রয়েছে std::map::operator[]: এগুলি কনস্টের মানচিত্রে ব্যবহার করা যেতে পারে, যখন operator[]পারে না। এখন আপনি যদি ধারক অজ্ঞাবল কোড লিখতে চেয়েছিলেন তবে এমন কোনও কিছু যা মোকাবেলা করতে পারে const std::vector<T>&বা হয় const std::map<std::size_t, T>&, ContainerType::atতা আপনার পছন্দের অস্ত্র হবে।

যাইহোক, এই সমস্ত ক্ষেত্রে সাধারণত একরকম অবৈধ ডেটা-ইনপুট পরিচালনা করার সময় উপস্থিত হয়। আপনি যদি আপনার বৈধ পরিসর সম্পর্কে নিশ্চিত হন তবে আপনার সাধারণত যেমন হওয়া উচিত, আপনি সাধারণত ব্যবহার করতে পারেন operator[]তবে আরও ভাল, পুনরাবৃত্তি begin()এবং এর সাথে পুনরাবৃত্তি করতে পারেন end()


1

এই নিবন্ধ অনুযায়ী , পারফরম্যান্স একপাশে রেখে, এটি ব্যবহারে কোনও তাত্পর্য তৈরি করে না atবা operator[], কেবলমাত্র যদি ভ্যাক্টরের আকারের মধ্যে অ্যাক্সেসের গ্যারান্টি দেওয়া থাকে। অন্যথায়, যদি অ্যাক্সেস কেবল ভেক্টরের সক্ষমতা ভিত্তিক হয় তবে এটি ব্যবহার করা নিরাপদ at


4
ড্রাগন থাকতে হবে। আমরা যদি সেই লিঙ্কটিতে ক্লিক করি তবে কী হবে? (ইঙ্গিত: আমি এটি ইতিমধ্যে জানি, তবে স্ট্যাক ওভারফ্লোতে আমরা এমন মন্তব্যগুলিকে পছন্দ করি যা লিঙ্ক পচা না ভোগায়, অর্থাত আপনি কী বলতে চান তার একটি সংক্ষিপ্ত সংক্ষিপ্তসার সরবরাহ করুন)
সেবাস্তিয়ান মাচ

টিপ জন্য ধন্যবাদ. এটি এখন স্থির।
এএইচজে

0

দ্রষ্টব্য: মনে হচ্ছে কিছু নতুন লোকেরা ভুলটি না বলার সৌজন্য ছাড়াই এই উত্তরটিকে কমিয়ে দিচ্ছে। নীচের উত্তরটি সঠিক এবং এখানে যাচাই করা যেতে পারে ।

সত্যিই কেবল একটি পার্থক্য রয়েছে: atযখন সীমাবদ্ধ operator[]থাকে না তখন পরীক্ষা করে। এটি ডিবাগ বিল্ডগুলির পাশাপাশি রিলিজ বিল্ডগুলির ক্ষেত্রেও প্রযোজ্য এবং এটি মানদণ্ড দ্বারা খুব ভালভাবে সুনির্দিষ্ট। এটা খুব সহজ।

এটি atএকটি ধীর পদ্ধতি তৈরি করে তবে এটি ব্যবহার না করার জন্য এটি সত্যই খারাপ পরামর্শ at। আপনাকে নিখুঁত সংখ্যাগুলি দেখতে হবে, আপেক্ষিক সংখ্যাগুলি নয়। আমি নিরাপদে বাজি ধরতে পারি যে আপনার বেশিরভাগ কোড চর্বিযুক্ত ব্যয়বহুল অপারেশনগুলি করছে at। ব্যক্তিগতভাবে, আমি ব্যবহার করার চেষ্টা করি atকারণ আমি অপরিজ্ঞাত আচরণ তৈরি করতে এবং উত্পাদনে ঝাঁকুনির জন্য কোনও বাজে বাগ চাই না।


4
সি ++ এ ব্যতিক্রমগুলি বোঝানো হয়েছে একটি ত্রুটি পরিচালনার ব্যবস্থা, ডিবাগিংয়ের কোনও সরঞ্জাম নয়। ভেষজ সুটার ব্যাখ্যা করে যে কেন নিক্ষেপ std::out_of_rangeবা কোনও রূপ std::logic_error, আসলে এখানে এবং নিজের মধ্যে একটি যুক্তিযুক্ত ত্রুটি ।
বড় টেম্প

@ বিগটেম্প - আপনার মন্তব্য কীভাবে এই প্রশ্ন ও উত্তরের সাথে সম্পর্কিত তা আমি নিশ্চিত নই। হ্যাঁ, ব্যতিক্রম অত্যন্ত বিষয়ে বিতর্ক হয় কিন্তু প্রশ্ন এখানে মধ্যে পার্থক্য atএবং []এবং আমার উত্তর কেবল পার্থক্য পদ বলে। পার্ফ ইস্যু না হলে আমি ব্যক্তিগতভাবে "নিরাপদ" পদ্ধতি ব্যবহার করি। যেমন নুথ বলেছেন অকাল অপ্টিমাইজেশন করবেন না। এছাড়াও, দার্শনিক পার্থক্য নির্বিশেষে উত্পাদনের তুলনায় বাগগুলি প্রথম দিকে ধরা ভাল।
শীতল শাহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.