এসটিএল মানচিত্রে, [] এর চেয়ে মানচিত্র :: সন্নিবেশ করা ভাল?


201

কিছুক্ষণ আগে, এসটিএল মানচিত্রে কীভাবে মান সন্নিবেশ করা যায় সে সম্পর্কে আমার এক সহকর্মীর সাথে আলোচনা হয়েছিল । আমি পছন্দ করেছি map[key] = value; কারণ এটি প্রাকৃতিক বোধ করে এবং তিনি যখন পছন্দ করেন সেখানে পড়তে স্পষ্ট map.insert(std::make_pair(key, value))

আমি কেবল তাকে জিজ্ঞাসা করেছি এবং neitherোকানো ভাল হওয়ার কারণটি আমরা কেউই মনে করতে পারি না তবে আমি নিশ্চিত যে এটি কেবল স্টাইলের পছন্দ নয় বরং দক্ষতার মতো প্রযুক্তিগত কারণ ছিল। SGI STL রেফারেন্স সহজভাবে বলছেন "স্ট্রিক্টলি ভাষী, এই সদস্যের ফাংশন অপ্রয়োজনীয়। এটা শুধু সুবিধার জন্য বিদ্যমান"

কেউ কি আমাকে সে কারণ বলতে পারেন, বা আমি কেবল স্বপ্ন দেখছি যে একটি আছে?


2
সমস্ত দুর্দান্ত প্রতিক্রিয়া জন্য ধন্যবাদ - তারা সত্যিই সহায়ক হয়েছে। এটি সর্বোত্তমভাবে স্ট্যাক ওভারফ্লোর একটি দুর্দান্ত ডেমো। আমি কীভাবে গ্রহণযোগ্য উত্তর হওয়া উচিত তা সম্পর্কে ছিঁড়ে গিয়েছিলাম: নেটজেফ বিভিন্ন আচরণ সম্পর্কে আরও স্পষ্ট, গ্রেগ রজার্স পারফরম্যান্সের বিষয়গুলি উল্লেখ করেছেন। আমি যদি দুজনকেই টিক করতে পারি
ড্যানিও

6
প্রকৃতপক্ষে, সি ++ 11 দিয়ে আপনি সম্ভবত মানচিত্রের ব্যবহার শেষ করেছেন :: দ্বিগুণ নির্মাণ এড়ানো যা
এমপ্লেস

@ আইনপোকলুম: আসলে, স্কট মায়ারস তাঁর আলোচনায় "কার্যকর সি ++ এর জন্য বিকাশমান অনুসন্ধান" তে অন্যথায় পরামর্শ দেয়।
টমাস এডিং

3
@ আইনপোকলুম: সদ্য নির্মিত মেমোরিতে স্থান দেওয়ার ক্ষেত্রে এটিই ঘটে। তবে মানচিত্রের জন্য কিছু মানক প্রয়োজনীয়তার কারণে এম্প্লেস সন্নিবেশের চেয়ে ধীর হতে পারে এমন প্রযুক্তিগত কারণ রয়েছে। এই আলোচনাটি ইউটিউবে অবাধে উপলব্ধ, যেমন এই লিঙ্কটি youtube.com/watch?v=smqT9Io_bKo @ ~ 38-40 মিনিটের চিহ্ন হিসাবে। একটি এসও লিঙ্কের জন্য, এখানে
স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসা /

1
আমি মায়ার্স যা উপস্থাপন করেছিলেন তার সাথে কিছুটা নিয়ে তর্ক করব তবে এটি এই মন্তব্যের থ্রেডের বাইরে এবং যাইহোক, আমার ধারণা আমার আগের মন্তব্যটি প্রত্যাহার করতে হবে।
einpoklum

উত্তর:


240

আপনি যখন লিখুন

map[key] = value;

কোন উপায় যদি তোমাকে বলতে এর প্রতিস্থাপিতvalue জন্য key, অথবা আপনি যদি নির্মিত একটি নতুন keyসঙ্গে value

map::insert() শুধুমাত্র তৈরি করবে:

using std::cout; using std::endl;
typedef std::map<int, std::string> MyMap;
MyMap map;
// ...
std::pair<MyMap::iterator, bool> res = map.insert(MyMap::value_type(key,value));
if ( ! res.second ) {
    cout << "key " <<  key << " already exists "
         << " with value " << (res.first)->second << endl;
} else {
    cout << "created key " << key << " with value " << value << endl;
}

আমার বেশিরভাগ অ্যাপ্লিকেশনের জন্য, আমি তৈরি করছি বা প্রতিস্থাপন করছি তা আমি সাধারণত যত্ন করি না, তাই আমি পড়তে সহজতর ব্যবহার করি map[key] = value


16
মানচিত্রটি উল্লেখ করা উচিত: সন্নিবেশ কখনই মানগুলি প্রতিস্থাপন করে না। এবং সাধারণ ক্ষেত্রে আমি বলব যে এটি দ্বিতীয় ক্ষেত্রে ব্যবহার (res.first)->secondনা করে ব্যবহার করা ভাল value
ডাল

1
আমি আরও পরিষ্কার হতে আপডেট করেছি যে মানচিত্র :: সন্নিবেশ কখনও প্রতিস্থাপন করে না। আমি রেখেছি elseকারণ আমি মনে করি valueব্যবহারটি পুনরাবৃত্তির চেয়ে পরিষ্কার। কেবলমাত্র যদি মানটির ধরণটিতে একটি অস্বাভাবিক কপির কর্টর বা অপ === আলাদা থাকে, এবং এই ধরণের মানচিত্রের মতো এসটিএল ধারক ব্যবহার করে অন্যান্য সমস্যা দেখা দেয়।
নেটজেফ

1
map.insert(std::make_pair(key,value))হওয়া উচিত map.insert(MyMap::value_type(key,value))। থেকে ফিরে আসা make_pairinsert
ধরণটি

1
আপনি সন্নিবেশ করিয়েছেন বা সুনির্দিষ্টভাবে নিযুক্ত করেছেন কি না তা বলার একটি উপায় আছে operator[], কেবল তার আগে এবং পরে আকারের তুলনা করুন। ইমো map::operator[]কেবলমাত্র ডিফল্ট গঠনমূলক ধরণের জন্য কল করতে সক্ষম হওয়া আরও বেশি গুরুত্বপূর্ণ।
idclev 463035818

@ ডেভিডরডগ্রিজেজ-ড্রিবিয়াস: ভাল পরামর্শ, আমি আমার উত্তরে কোডটি আপডেট করেছি।
নেটজেফ

53

মানচিত্রে ইতিমধ্যে বিদ্যমান চাবিটি চলে আসে তখন দুজনের আলাদা শব্দার্থকতা থাকে। সুতরাং তারা সত্যিই সরাসরি তুলনাযোগ্য নয়।

তবে অপারেটর [] সংস্করণটির জন্য ডিফল্ট মানটি নির্ধারণ করা এবং তারপরে নির্ধারিত হওয়া প্রয়োজন, সুতরাং এটি যদি আরও ব্যয়বহুল হয় তবে কপি নির্মাণটি অনুলিপি করুন, তবে এটি আরও ব্যয়বহুল হবে। কখনও কখনও ডিফল্ট নির্মাণের অর্থ হয় না এবং তারপরে অপারেটরটি [] সংস্করণ ব্যবহার করা অসম্ভব।


1
Make_pair এর জন্য একটি অনুলিপি নির্মাণকারীর প্রয়োজন হতে পারে - এটি ডিফল্টর চেয়ে খারাপ। যাইহোক +1।

1
মূল কথাটি, যেমন আপনি বলেছেন, তাদের বিভিন্ন শব্দার্থবিজ্ঞান রয়েছে। সুতরাং উভয়ই অপরের তুলনায় ভাল নয়, কেবলমাত্র যা আপনার প্রয়োজন তা পূর্ণ করুন।
জাল্ফ

অ্যাসাইনমেন্টের পরে অনুলিপি নির্ধারকের তুলনায় অনুলিপি কেন অনুলিপি করবে? যদি এটি হয় তবে ক্লাসটি লিখেছেন এমন ব্যক্তিটি কিছু মিস করেছেন, কারণ যা কিছু অপারেটর = যা করে, তাদের অনুলিপি নির্মাণকারীকেও একই কাজ করা উচিত ছিল।
স্টিভ জেসোপ

1
কখনও কখনও ডিফল্ট নির্মাণের দায়িত্ব এতটা ব্যয়বহুল। প্রাকৃতিকভাবে অ্যাসাইনমেন্ট এবং অনুলিপি নির্মাণ সমতুল্য হবে।
গ্রেগ রজার্স 15

@ আরকাদি একটি অপ্টিমাইজড বিল্ডে, সংকলক প্রায়শই অনেক অপ্রয়োজনীয় অনুলিপি নির্মাণকারী কলগুলি সরিয়ে ফেলবে will
প্রেরণ করা হয়েছে

35

আরেকটি বিষয় লক্ষণীয় std::map:

myMap[nonExistingKey];একটি মানকটিতে একটি নতুন এন্ট্রি তৈরি করবে, nonExistingKeyএটি একটি ডিফল্ট মানকে আরম্ভ করার উদ্দেশ্যে তৈরি করা হবে ।

এটি আমার প্রথমবারের মতো দেখেছি (এই ভয়াবহ তদন্তের বিরুদ্ধে আমার মাথা বেঁধে দেওয়ার সময়) আমার থেকে বেরিয়ে এসেছিল scared এটা আশা করা হত না। আমার কাছে এটি গেট অপারেশন বলে মনে হচ্ছে এবং আমি "পার্শ্ব-প্রতিক্রিয়া" আশা করিনি। map.find()আপনার মানচিত্র থেকে উঠতে পছন্দ করুন ।


3
এটি একটি শালীন দৃষ্টিভঙ্গি, যদিও হ্যাশ মানচিত্রগুলি এই ফর্ম্যাটটির জন্য বেশ সর্বজনীন। এটি সেই "অদ্ভুততাগুলির মধ্যে একটি হতে পারে যা কেউ অদ্ভুত বলে মনে করে না" কেবল একই কারণে যে তারা একই সম্মেলনগুলি কতটা ব্যাপকভাবে ব্যবহার করে
স্টিফেন জে

19

যদি ডিফল্ট কনস্ট্রাক্টরের পারফরম্যান্স হিট কোনও সমস্যা না হয় তবে দয়া করে godশ্বরের প্রতি ভালবাসার জন্য আরও পাঠযোগ্য সংস্করণে যান।

:)


5
দ্বিতীয়! এটি চিহ্নিত করতে হবে। অনেক লোক ন্যানো-সেকেন্ড স্পিডআপের জন্য অবসন্নতার ব্যবসা করে। আমাদের উপর দরিদ্র প্রাণীদের দয়া করুন যা অবশ্যই এই ধরনের অত্যাচার বজায় রাখতে পারে!
মিঃ রিঃ

6
গ্রেগ রজার্স যেমন লিখেছেন: "মানচিত্রে ইতিমধ্যে বিদ্যমান চাবিটি আসে তখন দু'জনের আলাদা শব্দার্থকতা থাকে So সুতরাং তারা সত্যই সরাসরি তুলনাযোগ্য নয়" "
ডাল

এটি একটি পুরানো প্রশ্নোত্তর। তবে "আরও পঠনযোগ্য সংস্করণ" একটি বোকা কারণ। কারণ যা সবচেয়ে বেশি পঠনযোগ্য তা ব্যক্তির উপর নির্ভর করে।
ভালেন্টিন

14

insert ব্যতিক্রম সুরক্ষার দিক থেকে ভাল।

অভিব্যক্তিটি map[key] = valueআসলে দুটি অপারেশন:

  1. map[key] - ডিফল্ট মান সহ মানচিত্রের উপাদান তৈরি করা।
  2. = value - সেই উপাদানটিতে মানটি অনুলিপি করা।

দ্বিতীয় ধাপে একটি ব্যতিক্রম ঘটতে পারে। ফলস্বরূপ অপারেশনটি কেবল আংশিকভাবে সম্পন্ন হবে (মানচিত্রে একটি নতুন উপাদান যুক্ত করা হয়েছিল, তবে সেই উপাদানটি দিয়ে আরম্ভ করা হয়নি value)। যখন কোনও অপারেশন সম্পূর্ণ না হয়, তবে সিস্টেমের অবস্থা পরিবর্তিত হয়, তখন তাকে "পার্শ্ব প্রতিক্রিয়া" সহ অপারেশন বলা হয় called

insertঅপারেশন একটি দৃ guarantee় গ্যারান্টি দেয়, এর পার্শ্ব প্রতিক্রিয়া নেই (মানে https://en.wikedia.org/wiki/Exception_safety )। insertহয় সম্পূর্ণরূপে সম্পন্ন হয় অথবা এটি মানচিত্রটি অশোধিত অবস্থায় ফেলে দেয়।

http://www.cplusplus.com/references/map/map/insert/ :

যদি কোনও একক উপাদান toোকাতে হয় তবে ব্যতিক্রমের ক্ষেত্রে (দৃ strong় গ্যারান্টি) পাত্রে কোনও পরিবর্তন হবে না।


1
আরও গুরুত্বপূর্ণ, সন্নিবেশকরণের জন্য ডিফল্ট গঠনমূলক হতে মানের প্রয়োজন হয় না।
উমনিয়োব

13

যদি আপনার অ্যাপ্লিকেশনটি গতিসম্পন্ন হয় তবে আমি [] অপারেটরটি ব্যবহারের পরামর্শ দেব কারণ এটি মূল অবজেক্টের মোট 3 টি অনুলিপি তৈরি করে যার মধ্যে 2 অস্থায়ী বস্তু এবং যত তাড়াতাড়ি বা পরে ধ্বংস হয়ে গেছে।

তবে সন্নিবেশ () এ, মূল অবজেক্টের 4 টি অনুলিপি তৈরি করা হয়েছে যার মধ্যে 3 অস্থায়ী বস্তু (অগত্যা "অস্থায়ী" নয়) এবং ধ্বংস হয়।

যার জন্য অতিরিক্ত সময় অর্থ: ১. একটি বস্তুর মেমরি বরাদ্দ ২. একটি অতিরিক্ত কন্সট্রাক্টর কল ৩. একটি অতিরিক্ত ডেস্ট্রাক্টর কল ৪. একটি বস্তুর মেমরি ক্ষয়

যদি আপনার অবজেক্টগুলি বড় হয় তবে কনস্ট্রাক্টরগুলি সাধারণ, ডেস্ট্রাক্টররা প্রচুর রিসোর্স ফ্রিজ করে, উপরের পয়েন্টগুলি আরও বেশি গণনা করে। পঠনযোগ্যতা সম্পর্কে, আমি মনে করি উভয়ই যথেষ্ট ন্যায্য।

একই প্রশ্ন আমার মনে আসল তবে পড়ার যোগ্যতা নয় গতিতে। এখানে একটি নমুনা কোড দেওয়া হয়েছে যার মাধ্যমে আমি যে পয়েন্টটি উল্লেখ করেছি তা সম্পর্কে জানতে পেরেছি।

class Sample
{
    static int _noOfObjects;

    int _objectNo;
public:
    Sample() :
        _objectNo( _noOfObjects++ )
    {
        std::cout<<"Inside default constructor of object "<<_objectNo<<std::endl;
    }

    Sample( const Sample& sample) :
    _objectNo( _noOfObjects++ )
    {
        std::cout<<"Inside copy constructor of object "<<_objectNo<<std::endl;
    }

    ~Sample()
    {
        std::cout<<"Destroying object "<<_objectNo<<std::endl;
    }
};
int Sample::_noOfObjects = 0;


int main(int argc, char* argv[])
{
    Sample sample;
    std::map<int,Sample> map;

    map.insert( std::make_pair<int,Sample>( 1, sample) );
    //map[1] = sample;
    return 0;
}

সন্নিবেশ () ব্যবহার করা হলে আউটপুট [] অপারেটর ব্যবহার করা হলে আউটপুট


4
এখন পুরো অপটিমাইজেশন সক্ষম করে সেই পরীক্ষাটি আবার চালান।
প্রেরণ করা হয়েছে

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

1
@ এন্ট্রেড, insertএকই অনুসন্ধান করতে হবে, সুতরাং এর থেকে কোনও পার্থক্য নেই [](কারণ মানচিত্র কীগুলি অনন্য।
জেড

প্রিন্টআউটগুলির সাথে কী চলছে তার দুর্দান্ত চিত্রণ - তবে কোডের এই 2 বিট আসলে কী করছে? মূল বস্তুর 3 টি অনুলিপি কেন প্রয়োজনীয়?
rbennett485

১. অবশ্যই অ্যাসাইনমেন্ট অপারেটর বাস্তবায়ন করতে হবে, বা আপনি ডেস্ট্রাক্টরে ভুল নম্বর পাবেন ২. অতিরিক্ত কপি-নির্মাণ এড়াতে জোড় তৈরির সময় std :: সরানো ব্যবহার করুন "map.insert (std :: make_pair <int, sample> (1, std: : চাল (নমুনা))); "
Fl0

10

এখন সি ++ 11 এ আমি মনে করি যে কোনও এসটিএল মানচিত্রে একটি জুড়ি toোকানোর সর্বোত্তম উপায় হ'ল:

typedef std::map<int, std::string> MyMap;
MyMap map;

auto& result = map.emplace(3,"Hello");

ফলাফলের সঙ্গে একজোড়া হবে:

  • প্রথম উপাদান (ফলাফল.প্রথম), sertedোকানো জোড়টিকে নির্দেশ করে বা কীটি ইতিমধ্যে উপস্থিত থাকলে এই কীটির সাথে জোড়াটি নির্দেশ করে।

  • দ্বিতীয় উপাদান (ফলাফল.সেকেন্ড), সত্য যদি সন্নিবেশ সঠিক ছিল বা মিথ্যা কিছু ভুল হয়ে গেছে।

পিএস: আপনি যদি অর্ডারটি সম্পর্কে মামলা না করেন তবে আপনি std :: unordered_map;) ব্যবহার করতে পারবেন

ধন্যবাদ!


9

মানচিত্র :: সন্নিবেশ () সহ একটি গোচা হ'ল মানচিত্রটিতে কীটি ইতিমধ্যে বিদ্যমান থাকলে এটি কোনও মান প্রতিস্থাপন করবে না। আমি জাভা প্রোগ্রামারদের লিখিত সি ++ কোড দেখেছি যেখানে তারা জাভাতে মান.পুট () হিসাবে একইভাবে আচরণ করার জন্য সন্নিবেশ () সন্নিবেশ করেছে যেখানে মানগুলি প্রতিস্থাপন করা হয়েছে।


2

একটি দ্রষ্টব্য হ'ল আপনি বুস্টও ব্যবহার করতে পারেন ssসাইনাইন :

using namespace std;
using namespace boost::assign; // bring 'map_list_of()' into scope

void something()
{
    map<int,int> my_map = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
}

1

এখানে আরেকটি উদাহরণ, দেখাচ্ছে যে operator[] মুছে ফেলা হয় কী-এর জন্য মান যদি উপস্থিত থাকে, কিন্তু .insert ওভাররাইট না মান যদি উপস্থিত থাকে।

void mapTest()
{
  map<int,float> m;


  for( int i = 0 ; i  <=  2 ; i++ )
  {
    pair<map<int,float>::iterator,bool> result = m.insert( make_pair( 5, (float)i ) ) ;

    if( result.second )
      printf( "%d=>value %f successfully inserted as brand new value\n", result.first->first, result.first->second ) ;
    else
      printf( "! The map already contained %d=>value %f, nothing changed\n", result.first->first, result.first->second ) ;
  }

  puts( "All map values:" ) ;
  for( map<int,float>::iterator iter = m.begin() ; iter !=m.end() ; ++iter )
    printf( "%d=>%f\n", iter->first, iter->second ) ;

  /// now watch this.. 
  m[5]=900.f ; //using operator[] OVERWRITES map values
  puts( "All map values:" ) ;
  for( map<int,float>::iterator iter = m.begin() ; iter !=m.end() ; ++iter )
    printf( "%d=>%f\n", iter->first, iter->second ) ;

}

1

এটি একটি বরং সীমাবদ্ধ মামলা, তবে আমি যে মন্তব্য পেয়েছি তা বিচার করে আমি মনে করি এটি লক্ষ্য করার মতো।

আমি অতীতে মানুষকে আকারে মানচিত্র ব্যবহার করতে দেখেছি

map< const key, const val> Map;

দুর্ঘটনাজনিত মান ওভাররাইটিংয়ের ঘটনাগুলি এড়ানোর জন্য, তবে তারপরে কোডের অন্য কিছু বিটগুলিতে লেখার জন্য এগিয়ে যান:

const_cast< T >Map[]=val;

আমার স্মরণ হিসাবে এটি করার তাদের কারণ ছিল কারণ তারা নিশ্চিত ছিল যে কোডের এই নির্দিষ্ট বিটগুলিতে তারা মানচিত্রের মানগুলিকে ওভাররাইট করে না; অতএব, আরও 'পাঠযোগ্য' পদ্ধতিটি নিয়ে এগিয়ে যাওয়া going[]

এই ব্যক্তিদের দ্বারা রচিত কোডটি থেকে আমার আসলে কোনও সরাসরি সমস্যা হয়নি, তবে আমি আজ অবধি দৃ strongly়ভাবে অনুভব করি যে ঝুঁকি - যদিও ছোট - সেগুলি এড়ানো উচিত নয় যখন সেগুলি সহজে এড়ানো যায়।

এমন ক্ষেত্রে যেখানে আপনি মানচিত্রের মানগুলি নিয়ে কাজ করছেন যা অবশ্যই একেবারে ওভাররাইট করা উচিত নয় , ব্যবহার করুন insert। কেবল পঠনযোগ্যতার জন্য ব্যতিক্রম করবেন না।


একাধিক লোক লিখেছেন? অবশ্যই ব্যবহার করুন insert(না input), const_castকারণ পূর্বের কোনও মানকে ওভাররাইট করা হবে, যা খুব অবিরাম। অথবা, মান ধরণের হিসাবে চিহ্নিত করবেন না const। (জিনিস যে সাজানোর সাধারণত চূড়ান্ত ফল const_cast, এটি প্রায় সবসময় একটি লাল অন্য কোথাও একটি ত্রুটি ইঙ্গিত পতাকা তাই।)
Potatoswatter

আপনি কি ঠিক বলেছেন আমি কেবল দেখছি যে কনস্ট_কাস্ট [] কিছু লোক কনস্টের মানচিত্রের মানগুলির সাথে ব্যবহৃত হয় যখন তারা নিশ্চিত হন যে তারা কোডের কিছু বিটগুলিতে কোনও পুরানো মান প্রতিস্থাপন করবেন না; যেহেতু [] নিজেই আরও পাঠযোগ্য। আমি আমার উত্তরের চূড়ান্ত বিট হিসাবে উল্লেখ করেছি, আমি এমন insertক্ষেত্রে ব্যবহারের পরামর্শ দেব যেখানে আপনি মানগুলি ওভাররাইট হওয়া থেকে রোধ করতে চান। (জাস্ট পরিবর্তিত inputকরতে insert- ধন্যবাদ)
dk123

@ পোটাটোসওয়টার যদি আমি সঠিকভাবে স্মরণ করি তবে প্রধান কারণগুলি const_cast<T>(map[key])যেগুলি লোকেরা ব্যবহার করছে বলে মনে হয় সেগুলি হ'ল 1 [ অজান্তে কোডের অন্যান্য বিটগুলি তাদের মানগুলিকে ওভাররাইট করতে চায় - সুতরাং const value
dk123

2
আমি এই ঘটনার কথা কখনও শুনিনি; কোথায় আপনি এই দেখেছিলেন? লেখার const_castঅতিরিক্ত "পাঠযোগ্যতা" অস্বীকার করার চেয়ে আরও বেশি মনে হয় []এবং এই ধরণের আত্মবিশ্বাস প্রায় কোনও বিকাশকারীকে আগুন দেওয়ার জন্য যথেষ্ট ভিত্তি। কূট রানটটাইম শর্তগুলি বুলেটপ্রুফ ডিজাইনের মাধ্যমে সমাধান করা হয়, অন্তরের অনুভূতি নয়।
পোটোসওয়টার

@ পোটাটোসোভেটর আমার মনে আছে এটি আমার অতীতের একটি কাজের জন্য শিক্ষাগত গেমস বিকাশ করছিল। লোকদের অভ্যাস পরিবর্তনের জন্য কোডটি লিখতে আমি কখনই পেতে পারি না। আপনি একেবারে ঠিক আছেন এবং আমি দৃ strongly়ভাবে আপনার সাথে একমত। আপনার মন্তব্যগুলি থেকে, আমি সিদ্ধান্ত নিয়েছি যে এটি সম্ভবত আমার মূল উত্তরটির চেয়ে বেশি লক্ষণীয় এবং তাই এটি প্রতিফলিত করার জন্য আমি এটি আপডেট করেছি। ধন্যবাদ!
dk123

1

Std :: মানচিত্র insert()ফাংশনটি কীটির সাথে সম্পর্কিত মানটিকে ওভাররাইট করে না তা আমাদের এই জাতীয় অবজেক্টের এনুমুরেশন কোড লিখতে দেয়:

string word;
map<string, size_t> dict;
while(getline(cin, word)) {
    dict.insert(make_pair(word, dict.size()));
}

এটি একটি খুব সাধারণ সমস্যা যখন আমাদের কিছু আইডিতে 0..N এর মধ্যে বিভিন্ন অ-অনন্য বস্তু ম্যাপ করতে হয় to এই আইডিগুলির পরে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ, গ্রাফ অ্যালগরিদমে। এর সাথে বিকল্পটি operator[]আমার মতে কম পঠনযোগ্য মনে হবে:

string word;
map<string, size_t> dict;
while(getline(cin, word)) {
    size_t sz = dict.size();
    if (!dict.count(word))
        dict[word] = sz; 
} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.