এসটিডি :: মানচিত্রের মাধ্যমে পুনরাবৃত্তি করার ক্রমটি কি পরিচিত (এবং মানদণ্ডের দ্বারা নিশ্চিত)?


158

আমি যা বলতে চাইছি তা - আমরা জানি যে std::mapএর উপাদানগুলি কী অনুসারে বাছাই করা হয়েছে। সুতরাং, আসুন কীগুলি বলতে হয় পূর্ণসংখ্যা হয়। যদি থেকে আমি বারবার std::map::begin()করতে std::map::end()একটি ব্যবহার for, মানক গ্যারান্টি যে আমি কী এর মাধ্যমে উপাদানের মাধ্যমে পরিণামে পুনরুক্তি করব না, যাতে আরোহী সাজানো?


উদাহরণ:

std::map<int, int> map_;
map_[1] = 2;
map_[2] = 3;
map_[3] = 4;
for( std::map<int, int>::iterator iter = map_.begin();
     iter != map_.end();
     ++iter )
{
    std::cout << iter->second;
}

এটি কি মুদ্রণের গ্যারান্টিযুক্ত 234বা এটি প্রয়োগের সংজ্ঞা দেওয়া হয়েছে?


বাস্তব জীবনে কারণ: আমি একটি আছে std::mapসঙ্গে intকি। খুব বিরল পরিস্থিতিতে আমি কংক্রিটের চেয়ে বড় intমান সহ সমস্ত উপাদান দিয়ে পুনরাবৃত্তি করতে চাই । হ্যাঁ, মনে হচ্ছে std::vectorএটি আরও ভাল পছন্দ হবে তবে আমার "খুব বিরল পরিস্থিতি" লক্ষ্য করুন।


সম্পাদনা : আমি জানি যে উপাদানগুলি std::mapসাজানো আছে .. এটি উল্লেখ করার দরকার নেই (বেশিরভাগ উত্তরের জন্য এখানে)। এমনকি আমি আমার প্রশ্নে এটি লিখেছি।
আমি যখন একটি ধারক দিয়ে পুনরাবৃত্তি করছিলাম তখন আমি পুনরাবৃত্তকারী এবং ক্রম সম্পর্কে জিজ্ঞাসা করছিলাম। উত্তরের জন্য @ কেরেক এসবি ধন্যবাদ।


6
আপনি যদি না জানতেন: আপনার বাস্তব জীবনে আপনি map::upper_boundপুনরাবৃত্তি শুরু করার জন্য পয়েন্টটি খুঁজে পেতে ব্যবহার করতে পারেন ।
স্টিভ জেসপ

আমি এটি জানি এবং আমি পুনরাবৃত্তি শুরু করার সঠিক স্থানটি জানি। অর্ডার গ্যারান্টিযুক্ত হলে আমি কেবল ঘুরে বেড়াই।
কিরিল কিরভ

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

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

উত্তর:


176

হ্যাঁ, এটি গ্যারান্টিযুক্ত তদ্ব্যতীত, তুলনা অপারেটর দ্বারা নির্ধারিত হিসাবে *begin()আপনাকে সবচেয়ে ছোট এবং *rbegin()বৃহত্তম উপাদান দেয় এবং দুটি মূল মান aএবং bযার জন্য অভিব্যক্তিটি !compare(a,b) && !compare(b,a)সত্য তাকে সমান হিসাবে বিবেচনা করা হয়। ডিফল্ট তুলনা ফাংশন হয় std::less<K>

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


std :: মানচিত্র বাইনারি গাছ ব্যবহার করে প্রয়োগ করা হয়েছে, সুতরাং প্রযুক্তিগতভাবে কোনও বাইনারি অনুসন্ধান করা হয় না।
jupp0r

11
@ jupp0r: বাইনারি অনুসন্ধান ট্রি হিসাবে একটি পরিসীমা গঠন হ'ল পরিসীমা মাধ্যমে বাইনারি অনুসন্ধান বাস্তবায়নের একটি বিশেষ পদ্ধতি। "বাইনারি অনুসন্ধান" নির্দিষ্ট প্রয়োগের পরিবর্তে একটি বিমূর্ত ধারণা। আপনি অফসেটগুলির মাধ্যমে একটি অ্যারেতে ঝাঁপিয়ে পড়ুন বা লিঙ্ক নোডগুলি অনুসরণ করুন তা বিবেচনাধীন নয়; সেগুলি কেবল "পরিসীমা দ্বিখণ্ডিত করার" নির্দিষ্ট উপায়।
কেরেক এসবি

1
আমি জানি এটি একটি পুরানো পোস্ট, তবে পরিষ্কার করার জন্য "দক্ষ অনুসন্ধান" আপেক্ষিক। প্রযুক্তিগতভাবে std::unordered_mapও (1) এর আরও দক্ষ দেখার সময় রয়েছে। এর সুবিধা std::mapকী অর্ডার করতে হয়, তবে খোঁজ নয়।
অ্যাডাম জনস্টন

42

এটি সি ++ স্ট্যান্ডার্ডে এসোসিয়েটিভ ধারক প্রয়োজনীয়তার দ্বারা গ্যারান্টিযুক্ত। যেমন সি ++ 11 এ 23.2.4 / 10 দেখুন:

এসোসিয়েটিভ পাত্রে পুনরাবৃত্তিকারীদের মৌলিক সম্পত্তি হ'ল তারা
কীগুলির অ-উতরান ক্রমের ধারকগুলির মাধ্যমে পুনরাবৃত্তি করুন
অ-উতরাই যে তুলনা করে তাদের নির্মাণ করতে ব্যবহৃত হয়েছিল তা দ্বারা সংজ্ঞায়িত করা হয়।
যে কোনও দুটি ডিফেরেফেরিয়াল ইটারেটরগুলির জন্য i এবং j এর মতো i থেকে j এর দূরত্ব
ইতিবাচক,
  মান_কম্প (* জে, * আই) == মিথ্যা

এবং 23.2.4 / 11

অনন্য কীগুলির সাথে সহকারী পাত্রে শক্তিশালী শর্তটি রাখে,
  মান_কম্প (* আমি, * জে)! = মিথ্যা।

32

আমি মনে করি ডেটা স্ট্রাকচারে একটি বিভ্রান্তি রয়েছে।

বেশিরভাগ ভাষায়, একটি mapকেবল একটি এসোসিয়েটিভ কন্টেইনার: এটি একটি মূল্যের মূল মানচিত্র করে। "নতুন" ভাষাগুলিতে, এটি সাধারণত একটি হ্যাশ মানচিত্র ব্যবহার করে অর্জিত হয়, সুতরাং কোনও আদেশের গ্যারান্টি নেই।

সি ++ তে তবে এটি তেমন নয়:

  • std::mapএকটি হল সাজানো মিশুক ধারক
  • std::unordered_map সি ++ 11 এ প্রবর্তিত একটি হ্যাশ-টেবিল ভিত্তিক এসোসিয়েটিভ ধারক

সুতরাং, আদেশে গ্যারান্টি স্পষ্ট করতে।

সি ++ 03 তে:

  • std::set, std::multiset, std::mapএবং std::multimapকী অনুযায়ী আদেশ করা নিশ্চিত করা হয় (এবং মাপদণ্ড সরবরাহকৃত)
  • মধ্যে std::multisetএবং std::multimap, মানক সমতুল্য উপাদানে কোনো আদেশ গ্যারান্টি আরোপ করে না (অর্থাত, যারা যা সমান তুলনা)

সি ++ 11 এ:

  • std::set, std::multiset, std::mapএবং std::multimapকী অনুযায়ী আদেশ করা নিশ্চিত করা হয় (এবং মাপদণ্ড সরবরাহকৃত)
  • মধ্যে std::multisetএবং std::multimapস্ট্যান্ডার্ড imposes যে সমতুল্য উপাদানের (যারা যা সমান তুলনা) তাদের সন্নিবেশ অর্ডার অনুযায়ী আদেশ হয় (প্রথম প্রথম প্রবিষ্ট)
  • std::unordered_*পাত্রে নাম হিসাবে বোঝানো হয়, আদেশ না। উল্লেখযোগ্যভাবে, ধারকটি সংশোধন করা হলে (সন্নিবেশ / মোছার পরে) উপাদানগুলির ক্রম পরিবর্তন হতে পারে

স্ট্যান্ডার্ড যখন বলে যে উপাদানগুলি কোনওভাবে অর্ডার করা হয়, তার অর্থ এটি:

  • পুনরাবৃত্তি করার সময়, আপনি সংজ্ঞায়িত ক্রমের উপাদানগুলি দেখতে পাবেন
  • বিপরীতে পুনরাবৃত্তি যখন, আপনি বিপরীত ক্রমে উপাদান দেখতে

আমি আশা করি এটি কোনও বিভ্রান্তি দূর করে।


আমার প্রশ্নের সাথে এর কোনও যোগসূত্র নেই, দুঃখিত :) আমি জানি কোনটি অর্ডার করা হয়েছে, এবং কোনটি - নয়। এবং যখন আমি উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করি তখন আমি অর্ডারটি চাইছি
কিরিল কিরভ

10
@ কিরিলকিরভ: ভাল, একটি আদেশযুক্ত সংশ্লেষক ধারকটির সংজ্ঞাটি এটির মাধ্যমে পুনরাবৃত্তি করার সময় উপাদানগুলির আদেশ দেওয়া হয়।
ম্যাথিউ এম।

ঠিক আছে, আমি অনুমান করি আপনি ঠিক বলেছেন, তবে আমি তা জানতাম না এবং আমি যা বলছিলাম ঠিক
এটিই

4

এটি কি 234 মুদ্রণের গ্যারান্টিযুক্ত বা এর বাস্তবায়ন সংজ্ঞাযুক্ত?

হ্যাঁ, std::mapএকটি সাজানো ধারক, Keyসরবরাহকারীর দ্বারা আদেশযুক্ত Comparator। সুতরাং এটি নিশ্চিত।

আমি চাবি সহ সমস্ত উপাদানগুলিতে পুনরাবৃত্তি করতে চাই, যা কংক্রিটের ইনট মান থেকে বেশি।

এটা অবশ্যই সম্ভব।


3

হ্যাঁ ... একটিতে থাকা উপাদানগুলির std::mapএকটি কঠোর দুর্বল ক্রম রয়েছে, যার অর্থ উপাদানগুলি একটি সেট দ্বারা গঠিত হবে (অর্থাত্, "সমান" কীগুলির পুনরাবৃত্তি হবে না) এবং যে কোনওটির উপর পরীক্ষা করে সমতা নির্ধারণ করা হয় দুটি কী A এবং B, যে কী A যদি কী B এর চেয়ে কম না হয় এবং B A এর চেয়ে কম না হয় তবে কী A কী বি এর সমান হয় that

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


অন্যান্য উত্তর হিসাবে, এটি আসলে আমার প্রশ্নের উত্তর দেয় না, যাইহোক ধন্যবাদ।
কিরিল কিরভ

-3

আরম্ভ () সবচেয়ে ছোট উপাদান দিতে পারে। তবে তা বাস্তবায়ন নির্ভর। এটি কি সি ++ স্ট্যান্ডার্ডে নির্দিষ্ট করা আছে? যদি তা না হয় তবে এই অনুমান করা বিপজ্জনক।

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