আইট্রেটার অবৈধকরণের নিয়ম


543

সি ++ পাত্রে আইট্রেটর অবৈধকরণের নিয়ম কী কী?

সাধারণত সংক্ষিপ্ত তালিকা বিন্যাসে।

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


উত্তরগুলি কি আপনার উত্তর হিসাবে একই বিন্যাসে থাকা উচিত?
পিডব্লিউ

@ পিডব্লিউ আইএমও যা প্রতিসমের জন্য পছন্দ করা হবে তবে আমি এটি প্রয়োগ করতে পারি না: পি
অরবিট

সি ++ 20 সম্পর্কে কী?
ওয়াল্টার

1
@ ওয়াল্টার এখনও অস্তিত্ব নেই;)
এ অরবিট-এ

এই প্রশ্নটি হ'ল ফিতুরামার বোকা বয়সের যুগে লীলা উদ্ধৃত করা এবং আমার বিনয়ী মতামতটি খোলা ছেড়ে দেওয়া উচিত।
রোমান Luštrik

উত্তর:


110

সি ++ 17 (সমস্ত উল্লেখ সিপিপি 17 এর চূড়ান্ত কার্যকরী খসড়া থেকে - n4659 )


সন্নিবেশ

সিকোয়েন্স পাত্রে

  • vector: ফাংশন insert, emplace_back, emplace, push_backকারণ পদ্ধতিতে পুনরায় বরাদ্দকরণের নতুন আকার পুরাতন ধারণক্ষমতা চেয়ে বেশী। পুনঃনির্ধারণটি ক্রমটির উপাদানগুলিকে উল্লেখ করে সমস্ত রেফারেন্স, পয়েন্টার এবং পুনরাবৃত্তিকে অবৈধ করে দেয়। যদি কোনও পুনঃনির্ধারণ না ঘটে, সন্নিবেশ পয়েন্টের আগে সমস্ত পুনরাবৃত্তি এবং রেফারেন্স বৈধ থাকবে। [২.3.৩.১১.৫/১] ফাংশনটি
    সম্পর্কে শ্রদ্ধার সাথে reserveপুনঃনির্ধারণ সমস্ত রেফারেন্স, পয়েন্টার এবং পুনরাবৃত্তিকে ক্রমের উপাদানগুলিকে উল্লেখ করে অবৈধ করে দেয়। কোন পদ্ধতিতে পুনরায় বরাদ্দকরণের সন্নিবেশ যে একটি কল পরে ঘটতে সময় সঞ্চালিত নেবে reserve()সময় যখন একটি সন্নিবেশ মান চেয়ে ভেক্টর বৃহত্তর আকার করতে হবে যতক্ষণ না capacity()। [26.3.11.3/6]

  • deque: ডেকের মাঝখানে একটি সন্নিবেশ সমস্ত পুনরাবৃত্তকারীকে এবং অদৃশ্য উপাদানগুলির রেফারেন্সকে অকার্যকর করে দেয়। ডেকের উভয় প্রান্তে একটি সন্নিবেশ সমস্ত পুনরাবৃত্তিকে ডেকের কাছে অকার্যকর করে তোলে তবে ডেস্কের উপাদানগুলির রেফারেন্সের বৈধতার উপর তার কোনও প্রভাব নেই। [26.3.8.4/1]

  • list: পুনরাবৃত্তি এবং রেফারেন্সের বৈধতা প্রভাবিত করে না। যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে কোনও প্রভাব নেই। [26.3.10.4/1]। , , , , , ফাংশন এই শাসনে আচ্ছাদিত করা হয়।
    insertemplace_frontemplace_backemplacepush_frontpush_back

  • forward_list: ওভারলোডগুলির মধ্যে insert_afterকোনওটিই পুনরাবৃত্তকারী এবং রেফারেন্সের বৈধতাকে প্রভাবিত করবে না [26.3.9.5/1]

  • array: একটি নিয়ম হিসাবে , অ্যারেরগুলিতে পুনরাবৃত্তিকারী অ্যারের জীবনকাল জুড়ে কখনও অবৈধ হয় না। তবে একটিটিকে অবশ্যই খেয়াল করা উচিত যে অদলবদলের সময়, পুনরুক্তিকারী একই অ্যারে উপাদানটির দিকে ইঙ্গিত করতে থাকবে এবং এভাবে এর মান পরিবর্তন করবে।

সহযোগী পাত্রে

  • All Associative Containers: insertএবং emplaceসদস্যগণ পুনরাবৃত্তকারীগুলির বৈধতা এবং ধারকটির উল্লেখগুলিকে প্রভাবিত করবে না [২ 26.২..6 / ৯]

আনর্ডার্ড অ্যাসোসিয়েটিভ পাত্রে

  • All Unordered Associative Containers: পুনঃভাগ করা পুনরুদ্ধারকে পুনরায় অবৈধ করে দেয়, উপাদানগুলির মধ্যে ক্রম পরিবর্তন করে এবং বালতি উপাদানগুলির মধ্যে উপস্থিত পরিবর্তনগুলি পরিবর্তিত হয় তবে পয়েন্টার বা উপাদানগুলির উল্লেখগুলি অকার্যকর করে না। [26.2.7 / 9]
    দ্য insertএবং emplaceসদস্যদের ধারক উপাদান রেফারেন্স বৈধতা প্রভাবিত করবে না, কিন্তু ধারক সব iterators বাতিল হতে পারে। [26.2.7 / 14]
    দ্য insertএবং emplaceযদি সদস্যদের iterators বৈধতা প্রভাবিত করবে না (N+n) <= z * B, যেখানে Nধারক সন্নিবেশ অপারেশন করার পূর্বে উপাদানের সংখ্যা, n, সন্নিবেশিত উপাদানের সংখ্যা হল Bধারক এর বালতি গণনা, এবং zহয় ধারক সর্বোচ্চ লোড ফ্যাক্টর। [26.2.7 / 15]

  • All Unordered Associative Containers: মার্জ অপারেশনের ক্ষেত্রে (যেমন, a.merge(a2)) স্থানান্তরকারী উপাদানগুলিকে উল্লেখ করে পুনরাবৃত্তকারী এবং উল্লেখ করা সমস্ত পুনরাবৃত্তিকে aঅবৈধ করা হবে, তবে এতে a2থাকা উপাদানগুলিতে পুনরাবৃত্তি বৈধ থাকবে। (সারণী 91 - আনঅর্ডার্ড সাহসী ধারক প্রয়োজনীয়তা)

ধারক অ্যাডাপ্টার

  • stack: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • priority_queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত

ইরেজিওর

সিকোয়েন্স পাত্রে

  • vector: ফাংশন eraseএবং pop_backমুছে ফেলা বা তার পরে পুনরাবৃত্তি এবং রেফারেন্স। [26.3.11.5/3]

  • deque: একটি মোছা অপারেশন যা মুছে ফেলার শেষ উপাদানটি dequeকেবলমাত্র অতীত-শেষের পুনরাবৃত্তকারী এবং সমস্ত পুনরাবৃত্তকারী এবং মুছে ফেলা উপাদানগুলির রেফারেন্সকে অকার্যকর করে। একটি মুছা অপারেশন যা একটি এর প্রথম উপাদানটি মুছে দেয় dequeতবে শেষ উপাদান নয় কেবল মুছে ফেলা উপাদানগুলির উল্লেখ এবং পুনরাবৃত্তিগুলি বাতিল করে। একটি মুছে ফেলা অপারেশন যা কোনও পূর্ব উপাদান বা শেষের উপাদানটিকেই dequeপূর্বের-শেষ প্রান্তটি এবং সমস্ত পুনরাবৃত্তকারী এবং সমস্ত উপাদানগুলির রেফারেন্সকে অবৈধ করে দেয় deque। [দ্রষ্টব্য: pop_frontএবং pop_backমুছে ফেলা অপারেশন। Note অন্তর্ভুক্ত নোট] [26.3.8.4/4]

  • list: মুছে ফেলা উপাদানগুলির জন্য কেবল পুনরাবৃত্তিকারীদের এবং রেফারেন্সকে অবৈধ করে। [26.3.10.4/3]। এই প্রযোজ্য erase, pop_front, pop_back, clearফাংশন।
    removeএবং remove_ifসদস্য ফাংশন: তালিকার সমস্ত উপাদান মুছে ফেলা হয় তালিকার পুনরাবৃত্তকারী দ্বারা উল্লেখ করা iযার জন্য নিম্নলিখিত শর্তগুলি ধারণ করে: *i == value, pred(*i) != false। মুছে ফেলা উপাদানগুলির কেবলমাত্র পুনরাবৃত্তি এবং রেফারেন্সকে অবৈধ করে তোলে [26.3.10.5/15]।
    uniqueসদস্য ফাংশন - মুছে দেয় সব কিন্তু প্রথম উপাদান থেকে সমান উপাদানের যে পরপর গ্রুপ পুনরুক্তিকারীর দ্বারা উল্লেখ করা iসীমার মধ্যে [first + 1, last)যার জন্য *i == *(i-1)(কোন আর্গুমেন্ট সহ অনন্য সংস্করণ) অথবাpred(*i, *(i - 1))(ভবিষ্যদ্বাণীপূর্ণ যুক্তির সাথে অনন্য সংস্করণের জন্য) হোল্ড করে। মুছে যাওয়া উপাদানগুলির জন্য কেবল পুনরাবৃত্তিকারীদের এবং রেফারেন্সগুলিকে অবৈধ করে। [26.3.10.5/19]

  • forward_list: erase_afterমুছে ফেলা উপাদানগুলির জন্য কেবল পুনরাবৃত্তি এবং রেফারেন্সকে অকার্যকর করবে। [26.3.9.5/1]।
    removeএবং remove_ifসদস্যের কার্যাদি - তালিকার সমস্ত উপাদান মুছে ফেলা হয় যা তালিকার পুনরাবৃত্তিকারী দ্বারা উল্লেখ করা হয় I যার জন্য নিম্নলিখিত শর্তগুলি ধারণ করে: *i == value(জন্য remove()), pred(*i)সত্য (এর জন্য remove_if())। মুছে যাওয়া উপাদানগুলির জন্য কেবল পুনরাবৃত্তিকারীদের এবং রেফারেন্সগুলিকে অবৈধ করে। [26.3.9.6/12]।
    uniqueসদস্য ফাংশন - রেঞ্জের আইট্রেটর i দ্বারা চিহ্নিত প্রথম শ্রেণীর সমান উপাদানের প্রতিটি ধারাবাহিক গোষ্ঠীর প্রথম উপাদান ব্যতীত সমস্ত কিছুই মুছে ফেলে [প্রথম + 1, সর্বশেষ) যার *i == *(i-1)জন্য (কোনও যুক্তি ছাড়াই সংস্করণ নেই) বা pred(*i, *(i - 1))(একটি প্রিডিকেট সহ সংস্করণের জন্য ) আর্গুমেন্ট) ধরে। মুছে যাওয়া উপাদানগুলির জন্য কেবল পুনরাবৃত্তিকারীদের এবং রেফারেন্সগুলিকে অবৈধ করে। [26.3.9.6/16]

  • All Sequence Containers: এর clearসমস্ত উপাদানগুলিকে উল্লেখ করে সমস্ত রেফারেন্স, পয়েন্টার এবং পুনরাবৃত্তকারীকে অবৈধ করে এবং অতীত-শেষের পুনরাবৃত্তিকে অবৈধ করতে পারে (সারণী 87 - সিকোয়েন্স ধারক প্রয়োজনীয়তা)। তবে এর জন্য forward_list, clearঅতীত-শেষের পুনরাবৃত্তিকে অবৈধ করে না। [26.3.9.5/32]

  • All Sequence Containers: assignধারকটির উপাদানগুলির উল্লেখ করে সমস্ত রেফারেন্স, পয়েন্টার এবং পুনরাবৃত্তকারীকে অবৈধ করে। এর জন্য vectorএবং dequeঅতীত-শেষের পুনরাবৃত্তিকে অবৈধ করে। (সারণী 87 - সিকোয়েন্স কনটেইনার প্রয়োজনীয়তা)

সহযোগী পাত্রে

  • All Associative Containers: eraseসদস্যরা মুছে ফেলা উপাদানগুলির কেবলমাত্র পুনরাবৃত্তি এবং রেফারেন্সকে অকার্যকর করবে [২ 26.২..6 / ৯]

  • All Associative Containers: extractসদস্যরা সরানো উপাদানটিতে কেবল পুনরাবৃত্তিকারীকে অবৈধ করে দেয়; পয়েন্টার এবং সরানো উপাদানটির উল্লেখগুলি বৈধ থাকে [২ 26.২..6 / ১০]

ধারক অ্যাডাপ্টার

  • stack: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • priority_queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত

পুনরাবৃত্তকারী অবৈধ সংক্রান্ত সাধারণ ধারক প্রয়োজনীয়তা:

  • অন্যথায় নির্দিষ্ট না করা (স্পষ্টভাবে বা অন্য ফাংশনগুলির শর্তে কোনও ফাংশন সংজ্ঞায়িত করে), একটি ধারক সদস্য ফাংশন প্রার্থনা করা বা একটি গ্রন্থাগার ফাংশন হিসাবে একটি আর্গুমেন্ট হিসাবে একটি ধারক পাস করা আবশ্যককে আবদ্ধকারীকে অকার্যকর করে না বা সেই মানটির পরিবর্তন করে না container । [26.2.1 / 12]

  • কোনও swap()ফাংশন অদলবদলযোগ্য পাত্রে উপাদানগুলির উল্লেখ করে কোনও রেফারেন্স, পয়েন্টার বা পুনরাবৃত্তিকারীকে অবৈধ করে না । [দ্রষ্টব্য: শেষ () পুনরুক্তিকারী কোনও উপাদানকে উল্লেখ করে না, তাই এটি অবৈধ হতে পারে। Noteঅনোট নোট] [২ 26.২.১ / (১১..6)]

উপরের প্রয়োজনীয়তার উদাহরণ হিসাবে:

  • transformঅ্যালগরিদম: opএবং binary_opফাংশনগুলি পুনরাবৃত্তকারী বা উপশ্রেণীকে অবৈধ করতে পারে না বা রেঞ্জগুলিতে উপাদানগুলিকে সংশোধন করতে পারে না [২৮..6..4 / ১]

  • accumulateঅ্যালগরিদম: পরিসীমা [প্রথম, শেষ], binary_opউপাদানগুলিকে পরিবর্তন করবে না পুনরাবৃত্তকারী বা উপকেন্দ্রকে অকার্যকর করবে না [29.8.2 / 1]

  • reduceঅ্যালগোরিদম: বাইনারি_উপগুলি পুনরাবৃত্তকারী বা উপশ্রেণীকে অবৈধ করবে না বা [প্রথম, শেষ] সীমাতে উপাদান পরিবর্তন করবে না। [29.8.3 / 5]

এবং তাই ...


7
ওহে পিডব্লিউ তুমি নায়ক!
অরবিট

2
@ লাইটনেসেসেসিনআরবিট: আপনার মূল উত্তর ফর্ম্যাট অনুসারে এটি করার চেষ্টা করেছেন। :)
পিডব্লিউ

1
আমরা কি জন্য একটি তালিকা থাকতে পারে std::string? আমার মনে হয় এটা থেকে আলাদা std::vectorকারণে লগইন SSO করতে
sp2danny

1
@ sp2danny: এসএসওর কারণে, stringউপরে তালিকাবদ্ধ দ্বিতীয় সাধারণ প্রয়োজন ব্যর্থ। সুতরাং আমি এটি অন্তর্ভুক্ত না। পূর্ববর্তী FAQ এন্ট্রিগুলির একই প্যাটার্নটিতে আটকে থাকার চেষ্টাও করেছিলেন।
পিডব্লিউ

নিবন্ধন করুন লাইটনেসেসেস উইথমোনিকা কঠোর পরিশ্রমের জন্য আপনাকে ধন্যবাদ আমাকে কয়েকদিন ধরে বিভ্রান্ত করার একটা প্রশ্ন আছে। এই প্রসঙ্গে "অবৈধ" এর অর্থ কী? তার মানে "invalidated" can mean "no longer points to what it used to", not just "may not point to any valid element"যেমন @Marshall ক্লাউ এই বর্ণিত উত্তর ? অথবা এটি কেবলমাত্র 2 টি কনডেন্সের 1 টি নির্দেশ করে?
রিক

410

সি ++ 03 (উত্স: আইট্রেটার অবৈধকরণ বিধিমালা (সি ++ 03) )


সন্নিবেশ

সিকোয়েন্স পাত্রে

  • vector: সন্নিবেশ বিন্দুর আগে সমস্ত পুনরাবৃত্তকারী এবং রেফারেন্সগুলি প্রভাবিত না হয়ে থাকে, যদি না নতুন ধারক আকার পূর্বের ক্ষমতার চেয়ে বেশি না হয় (যার ক্ষেত্রে সমস্ত পুনরাবৃত্তি এবং রেফারেন্স অবৈধ হয়) [২৩.২..4.৩/১]
  • deque: সমস্ত পুনরাবৃত্তকারী এবং রেফারেন্স অবৈধ হয়, যদি না sertedোকানো সদস্য ডেকের শেষে (সামনে বা পিছনে) না থাকে (সেক্ষেত্রে সমস্ত পুনরুক্তি বাতিল করা হয় তবে উপাদানগুলির উল্লেখগুলি প্রভাবিত হয় না] [২৩.২.১.৩/১]
  • list: সমস্ত পুনরুক্তি এবং রেফারেন্স অকারণে [23.2.2.3/1]

সহযোগী পাত্রে

  • [multi]{set,map}: সমস্ত পুনরুক্তি এবং রেফারেন্স অকারণে [23.1.2 / 8]

ধারক অ্যাডাপ্টার

  • stack: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • priority_queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত

ইরেজিওর

সিকোয়েন্স পাত্রে

  • vector: মুছার পয়েন্টের পরে প্রতিটি পুনরাবৃত্তকারী এবং রেফারেন্স অবৈধ [23.2.4.3/3]
  • deque: মুছে ফেলা সদস্যরা ডেকের শেষে (সামনের বা পিছনে) না থাকলে (সমস্ত ক্ষেত্রে কেবল পুনরাবৃত্তিকারী এবং মুছা সদস্যদের রেফারেন্স অবৈধ) [23.2.1.3/4]
  • list: কেবল মুছে যাওয়া উপাদানটির পুনরাবৃত্তি এবং উল্লেখগুলি অবৈধ [23.2.2.3/3]

সহযোগী পাত্রে

  • [multi]{set,map}: কেবল পুনরাবৃত্তকারী এবং মুছে ফেলা উপাদানগুলির উল্লেখগুলি অবৈধ [23.1.2 / 8]

ধারক অ্যাডাপ্টার

  • stack: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • priority_queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত

আকার পরিবর্তন করা হচ্ছে

  • vector: সন্নিবেশ / মোছা হিসাবে [23.2.4.2/6]
  • deque: সন্নিবেশ / মোছা হিসাবে [23.2.1.2/1]
  • list: সন্নিবেশ / মোছা হিসাবে [23.2.2.2/1]

নোট 1

অন্যথায় নির্দিষ্ট না করা (স্পষ্টভাবে বা অন্য ফাংশনগুলির শর্তে কোনও ফাংশন সংজ্ঞায়িত করে), একটি ধারক সদস্য ফাংশন প্রার্থনা করা বা একটি গ্রন্থাগার ফাংশন হিসাবে একটি আর্গুমেন্ট হিসাবে একটি ধারক পাস করা আবশ্যককে আবদ্ধকারীকে অকার্যকর করে না বা সেই মানটির পরিবর্তন করে না container । [23.1 / 11]

নোট 2

সি ++ 2003 এ এটি পরিষ্কার নয় যে "শেষ" পুনরাবৃত্তিগুলি উপরের বিধিগুলির অধীন কিনা ; আপনার অনুমান করা উচিত, যাইহোক, তারা যে (বাস্তবে এটি যেমন রয়েছে)।

নোট 3

পয়েন্টারগুলিকে অবৈধ করার নিয়মগুলি রেফারেন্সকে বাতিল করার নিয়মের মতো।


5
ভাল আইডিয়া, শুধু লক্ষ্য করুন: আমি মনে করি যে মিশুক পাত্রে একটি একক লাইন একসঙ্গে গুটান যেতে পারে, এবং এটি তারপর আরেকটি লাইন যোগ মূল্য হতে পারে unordered মিশুক বেশী ... যদিও আমি কীভাবে করবেন নিশ্চিত নন rehashing অংশ হতে পারে সন্নিবেশ / মোছার উপর ম্যাপ করা হয়েছে, আপনি কি কোনও পরীক্ষা চালিয়ে যাবেন যে একটি পুনঃস্থাপনা ট্রিগার করা হবে কিনা?
ম্যাথিউ এম।

1
আইআইআরসি, কোথাও বিশ্লেষণে বলা হয়েছে যে শেষ পুনরাবৃত্তকারী "সেই ধারকের মধ্যে থাকা বস্তুর কাছে পুনরাবৃত্তিকারী নয়"। আমি অবাক হয়েছি যে এই গ্যারান্টিগুলি প্রতিটি ক্ষেত্রে শেষের পুনরাবৃত্তির সন্ধান করে?
জোহানেস স্কাউব -

1
@ মুহাম্মাদআন্নাকীব: এই শর্টকাটটি গ্রহণ করার সাথে সাথে এই উত্তরটি স্বীকারোক্তি সহকারে পরিষ্কার করা যায় না, তবে উদ্দেশ্যটি হ'ল পুনরায় আকার দেওয়ার বিষয়টি সন্নিবেশ / মুছে ফেলা বলে মনে হয় , যদি পুনর্নির্মাণের প্রয়োজন হয়, আপনি এটিকে মুছে ফেলার মতো বলে বিবেচনা করতে পারেন তারপরে সমস্ত প্রভাবিত উপাদান পুনরায় সন্নিবেশ করা হচ্ছে। উত্তরের সেই অংশটি অবশ্যই উন্নত হতে পারে।
অরবিট

1
@ ইয়াক্ক: তবে তা হয় না; উদ্ধৃত মান পাঠ্য দেখুন। দেখে মনে হচ্ছে এটি সি ++ 11 এ ঠিক করা হয়েছিল। :)
অরবিটে হালকা হওয়া রেস

1
@ মেটামোরফোসিস: অদৃশ্য ব্লকগুলিতে উপযুক্ত ডেটা সঞ্চয় করে। শুরুতে বা শেষে সন্নিবেশ করাতে একটি নতুন ব্লক বরাদ্দ হতে পারে, তবে এটি কখনই পূর্ববর্তী উপাদানগুলির চারপাশে ঘুরে না, তাই পয়েন্টারগুলি বৈধ থাকে। তবে নতুন / ব্লক বরাদ্দ করা হলে পরবর্তী / পূর্ববর্তী উপাদানগুলিতে যাওয়ার নিয়মগুলি পরিবর্তন হয়, সুতরাং পুনরাবৃত্তিকারীদের অবৈধ করা হয়।
নিক মাত্তিও

357

সি ++ ১১ (উত্স: আইট্রেটার অবৈধকরণ বিধি (সি ++ 0 এক্স) )


সন্নিবেশ

সিকোয়েন্স পাত্রে

  • vector: সন্নিবেশ বিন্দুর আগে সমস্ত পুনরাবৃত্তকারী এবং রেফারেন্সগুলি প্রভাবিত না হয়ে থাকে, যদি না নতুন ধারক আকারটি পূর্বের ক্ষমতার চেয়ে বেশি না হয় (যার ক্ষেত্রে সমস্ত পুনরাবৃত্তি এবং রেফারেন্স অবৈধ হয়) [২৩.৩..6.৫/১]
  • deque: সমস্ত পুনরাবৃত্তকারী এবং রেফারেন্স অবৈধ হয়, যদি না sertedোকানো সদস্য ডেকের শেষে (সামনে বা পিছনে) না থাকে (সেক্ষেত্রে সমস্ত পুনরুক্তি বাতিল করা হয় তবে উপাদানগুলির উল্লেখগুলি প্রভাবিত হয় না] [২৩.৩.৩.৪/১]
  • list: সমস্ত পুনরুক্তি এবং রেফারেন্স অকারণে [23.3.5.4/1]
  • forward_list: সমস্ত পুনরুক্তি এবং রেফারেন্স অকার্যকর (প্রযোজ্য insert_after) [23.3.4.5/1]
  • array: (এন / এ)

সহযোগী পাত্রে

  • [multi]{set,map}: সমস্ত পুনরুক্তি এবং রেফারেন্স অকারণে [23.2.4 / 9]

অরসোর্টড এসোসিয়েটিভ পাত্রে

  • unordered_[multi]{set,map}: পুনঃস্থাপনের সময় সমস্ত পুনরাবৃত্তি অকার্যকর হয় তবে রেফারেন্সগুলি প্রভাবিত হয় না [23.2.5 / 8]। Rehashing ঘটবে না যদি সন্নিবেশ ধারক আকার অতিক্রম পারে না z * Bযেখানে zসর্বোচ্চ লোড ফ্যাক্টর এবং Bবাকেট বর্তমান সংখ্যা। [23.2.5 / 14]

ধারক অ্যাডাপ্টার

  • stack: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • priority_queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত

ইরেজিওর

সিকোয়েন্স পাত্রে

  • vector: মুছার বিন্দুতে বা তার পরে প্রতিটি পুনরাবৃত্তকারী এবং রেফারেন্স অবৈধ [23.3.6.5/3]
  • deque: শেষ উপাদানটি মুছে ফেলা কেবল পুনরাবৃত্তিকে মুছে ফেলা এবং মুছে ফেলা উপাদানগুলি এবং অতীত-শেষের পুনরাবৃত্তির উল্লেখ; প্রথম উপাদানটি মুছে ফেলা কেবল পুনরাবৃত্তিকে মুছে ফেলা এবং মুছে ফেলা উপাদানগুলির উল্লেখগুলি; অন্য যে কোনও উপাদান মুছে ফেলা সমস্ত পুনরাবৃত্তকারী এবং রেফারেন্সকে অবৈধ করে দেয় (অতীতের শেষের পুনরাবৃত্তকারী সহ) [২৩.৩.৩.৪/৪]
  • list: কেবল মুছে যাওয়া উপাদানটির পুনরাবৃত্তি এবং উল্লেখগুলি অবৈধ [23.3.5.4/3]
  • forward_list: মুছে ফেলা উপাদানগুলির কেবলমাত্র পুনরাবৃত্তিকারী এবং উল্লেখগুলি অবৈধ (প্রযোজ্য erase_after) [23.3.4.5/1]
  • array: (এন / এ)

সহযোগী পাত্রে

  • [multi]{set,map}: কেবল পুনরাবৃত্তকারী এবং মুছে ফেলা উপাদানগুলির উল্লেখগুলি অবৈধ [23.2.4 / 9]

আনঅর্ডার্ড সাহসী পাত্রে

  • unordered_[multi]{set,map}: কেবল পুনরাবৃত্তকারী এবং মুছে ফেলা উপাদানগুলির উল্লেখগুলি অবৈধ [23.2.5 / 13]

ধারক অ্যাডাপ্টার

  • stack: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত
  • priority_queue: অন্তর্নিহিত ধারক থেকে উত্তরাধিকারসূত্রে প্রাপ্ত

আকার পরিবর্তন করা হচ্ছে

  • vector: সন্নিবেশ / মোছা হিসাবে [23.3.6.5/12]
  • deque: সন্নিবেশ / মোছা হিসাবে [23.3.3.3/3]
  • list: সন্নিবেশ / মোছা হিসাবে [23.3.5.3/1]
  • forward_list: সন্নিবেশ / মোছা হিসাবে [23.3.4.5/25]
  • array: (এন / এ)

নোট 1

অন্যথায় নির্দিষ্ট না করা (স্পষ্টভাবে বা অন্য ফাংশনগুলির শর্তে কোনও ফাংশন সংজ্ঞায়িত করে), একটি ধারক সদস্য ফাংশন প্রার্থনা করা বা একটি গ্রন্থাগার ফাংশন হিসাবে একটি আর্গুমেন্ট হিসাবে একটি ধারক পাস করা আবশ্যককে আবদ্ধকারীকে অকার্যকর করে না বা সেই মানটির পরিবর্তন করে না container । [23.2.1 / 11]

নোট 2

কোনও অদলবদল () ফাংশনটি অদলবদলের উপাদানগুলির উল্লেখ করে কোনও রেফারেন্স, পয়েন্টার বা পুনরাবৃত্তকারীকে অবৈধ করে না । [দ্রষ্টব্য: শেষ () পুনরুক্তিকারী কোনও উপাদানকে উল্লেখ করে না, তাই এটি অবৈধ হতে পারে । Note অন্তর্ভুক্ত নোট] [23.2.1 / 10]

নোট 3

উপরোক্ত ক্যাভিয়েট সম্পর্কিত অন্যান্য ব্যতীত swap(), "শেষ" পুনরাবৃত্তিগুলি উপরের তালিকাভুক্ত প্রতি ধারক নিয়মের সাপেক্ষে কিনা তা পরিষ্কার নয় ; আপনার অনুমান করা উচিত, যাইহোক, তারা যে।

নোট 4

vectorএবং সমস্ত অ-বিন্যাসিত সাহসী পাত্রে সমর্থন করে reserve(n)যা গ্যারান্টি দেয় যে ধারকটির আকার কমিয়ে না হওয়া পর্যন্ত কোনও স্বয়ংক্রিয় আকার পরিবর্তন হবে না nআনঅর্ডার্ড এসোসিয়েটিভ পাত্রে সাবধানতা অবলম্বন করা উচিত কারণ ভবিষ্যতের প্রস্তাব ন্যূনতম লোড ফ্যাক্টরের স্পেসিফিকেশনকে মঞ্জুরি দেয়, যা insertপর্যাপ্ত eraseক্রিয়াকলাপের পরে ন্যূনতমের নীচে কন্টেইনার আকার হ্রাস করতে পুনরায় পুনঃস্থাপনের অনুমতি দেয় ; গ্যারান্টি একটি পরে সম্ভাব্য শূন্য বিবেচনা করা উচিত erase


পাশাপাশি swap(), অনুলিপি / সরানো নিয়োগের ক্ষেত্রে পুনরাবৃত্তির বৈধতার জন্য কী বিধি রয়েছে?
বিদায়

@ লাইটনেসেসিনঅরবিট: সন্নিবেশ, মুছে ফেলা, পুনরায় আকার দেওয়ার ও স্বাপের মতো, অনুলিপি / সরানো কার্যনির্বাহীও স্টাড :: ভেক্টরের সদস্য ফাংশন, তাই আমি মনে করি আপনি তাদের জন্যও পুনরাবৃত্তির বৈধতার বিধি সরবরাহ করতে পারেন।
বিদায় 11

@ গুডবাইরা: আপনার অর্থ একটি উপাদান নির্ধারণ / অনুলিপি করা? এটি কোনও পুনরুক্তিকারীকে প্রভাবিত করবে না। কেন হবে? আপনি উপরের নোট 1 টি হিট করছেন ।
অরবিট

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

2
এই নিয়মগুলি কি সি ++ 14 এ সব একই? সি ++ 17 (এখন পর্যন্ত জানা যায়)?
einpoklum

40

এটা সম্ভবত যোগ মূল্য যে কোনো ধরনের একটি সন্নিবেশ পুনরুক্তিকারীর ( std::back_insert_iterator, std::front_insert_iterator,std::insert_iterator ) যতদিন বৈধ থাকা নিশ্চিত করা হয় হিসাবে সব সন্নিবেশ এই পুনরুক্তিকারীর মাধ্যমে সঞ্চালিত হয় এবং অন্য কোনো স্বাধীন পুনরুক্তিকারীর-invalidating ঘটনা ঘটে।

উদাহরণস্বরূপ, আপনি যখন std::vectorব্যবহার করে কোনও সন্নিবেশ ক্রিয়াকলাপ করছেনstd::insert_iterator এটি করে তখন যথেষ্ট সম্ভাবনা রয়েছে যে এই সন্নিবেশগুলি ভেক্টর পুনঃনির্মাণকে ট্রিগার করবে, যা সমস্ত পুনরাবৃত্তিকে সেই ভেক্টরের "পয়েন্ট" অবৈধ করে দেবে। যাইহোক, প্রশ্নের মধ্যে সন্নিবেশ পুনরাবৃত্তি বৈধ থাকার গ্যারান্টিযুক্ত, অর্থাত আপনি নিরাপদে সন্নিবেশের ক্রমটি চালিয়ে যেতে পারেন। মোটেও ভেক্টর রিলোকেশনটি ট্রিগার করার বিষয়ে চিন্তা করার দরকার নেই।

এটি আবার কেবল সন্নিবেশ পুনরাবৃত্তির মাধ্যমে সম্পাদিত সন্নিবেশগুলিতে প্রয়োগ হয়। যদি পুনরাবৃত্তকারী-অবৈধকরণ ইভেন্টটি ধারকটিতে কিছু স্বতন্ত্র ক্রিয়া দ্বারা ট্রিগার করা হয়, তবে সন্নিবেশ পুনরাবৃত্তি সাধারণ নিয়ম অনুসারে অবৈধ হয়ে যায়।

উদাহরণস্বরূপ, এই কোড

std::vector<int> v(10);
std::vector<int>::iterator it = v.begin() + 5;
std::insert_iterator<std::vector<int> > it_ins(v, it);

for (unsigned n = 20; n > 0; --n)
  *it_ins++ = rand();

ভেক্টরটি এই প্রক্রিয়াটির মাঝখানে কোথাও পুনর্বিবেচনার "সিদ্ধান্ত নেন" এমনকি ভেক্টরটিতে সন্নিবেশগুলির একটি বৈধ ক্রম সম্পাদন করার গ্যারান্টিযুক্ত। Iterator itস্পষ্টতই অবৈধ হয়ে যাবে, কিন্তু it_insবৈধ অবিরত থাকবে।


22

যেহেতু এই প্রশ্নটি অনেকগুলি ভোট দেয় এবং ধরণের একটি FAQ হয়ে ওঠে, তাই আমি অনুমান করি যে সি ++ 03 এবং সি ++ 11 এর মধ্যে একটির std::vectorসন্নিবেশনের ক্রিয়াকলাপের প্রভাব সম্পর্কে একটি উল্লেখযোগ্য পার্থক্য উল্লেখ করার জন্য পৃথক উত্তর লিখলে ভাল হবে gu iterators এবং সম্মান সঙ্গে রেফারেন্স বৈধতা reserve()এবং capacity()যা নোটিশ করতে ব্যর্থ সবচেয়ে সম্মত উত্তর নেই।

সি ++ 03:

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

সি ++ 11:

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

সুতরাং C ++ 03 unless the new container size is greater than the previous capacity (in which case all iterators and references are invalidated)এ এটি অন্য উত্তর হিসাবে উল্লিখিত " " নয় , পরিবর্তে, এটি হওয়া উচিত " greater than the size specified in the most recent call to reserve()"। এটি একটি জিনিস যা C ++ 03 সি ++ 11 থেকে পৃথক। সি ++ ০৩ এ একবার একবার insert()ভ্যাক্টরের আকার পূর্ববর্তী reserve()কলটিতে নির্দিষ্ট মানটিতে পৌঁছায় (যেটি বর্তমানের চেয়ে ভাল হতে পারে capacity()যেহেতু একটি জিজ্ঞাসার চেয়ে আরও reserve()বড় হতে পারে capacity()), পরবর্তী কোনও insert()পুনরায় স্থান নির্ধারণ এবং অকার্যকর হতে পারে সমস্ত পুনরাবৃত্তি এবং রেফারেন্স। সি ++ ১১-এ, এটি ঘটবে না এবং আপনি capacity()দৃ certain়তার সাথে এটি জানতে সর্বদা বিশ্বাস করতে পারবেন যে আকারটি ছাড়িয়ে যাওয়ার আগে পরবর্তী পুনঃনির্ধারণ হবে না capacity()

উপসংহারে, আপনি যদি C ++ 03 ভেক্টরের সাথে কাজ করছেন এবং আপনি সন্নিবেশ সম্পাদন করার সময় পুনরায় স্থানটি ঘটবে না তা নিশ্চিত করতে চান তবে আপনি যে যুক্তির মূল্য আগে পাঠিয়েছিলেন reserve()তার বিরুদ্ধে আকারটি পরীক্ষা করা উচিত, এটি নয় কোনও কলটির রিটার্ন মান capacity(), অন্যথায় আপনি নিজেকে একটি " অকাল " পুনঃব্যবস্থায় অবাক করে দিতে পারেন ।


14
যাইহোক, আমি যে কোনও সংকলক আমার সাথে এটি করিয়েছি সেগুলিকে আমি গুলি করব এবং দেশের কোনও জুরি আমাকে দোষী সাব্যস্ত করবে না।
ইয়াক্ক - অ্যাডাম নেভ্রামামন্ট

9
আমি এই "লক্ষ্য করতে ব্যর্থ" না; এটি সি ++ তে একটি সম্পাদকীয় ত্রুটি ছিল যা সি ++ 11 এ সংশোধন করা হয়েছিল। কোনও মূলধারার সংকলক ত্রুটির সুবিধা গ্রহণ করে না।
অরবিটে

1
@ ইয়াক্ক আমার মনে হয় এই জাতীয় পরিস্থিতিতে জিসিসি ইতিমধ্যে পুনরাবৃত্তিকারীদের অবৈধ করে দেয়।
শ্রীভাতসারআর

2

এখানে cppreferences.com থেকে একটি দুর্দান্ত সারসংক্ষেপ টেবিল :

এখানে চিত্র বর্ণনা লিখুন

এখানে, সন্নিবেশ এমন কোনও পদ্ধতিকে বোঝায় যা পাত্রে এক বা একাধিক উপাদান যুক্ত করে এবং মুছে ফেলা বোঝায় যে কোনও পদ্ধতি যা ধারক থেকে এক বা একাধিক উপাদান সরিয়ে দেয়।

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