একই ভেক্টর থেকে কোনও উপাদান পুশ_ব্যাক করা কি নিরাপদ?


126
vector<int> v;
v.push_back(1);
v.push_back(v[0]);

যদি দ্বিতীয় পুশ_ব্যাক কোনও পুনঃস্থাপনের কারণ হয় তবে ভেক্টরের প্রথম পূর্ণসংখ্যার রেফারেন্স আর বৈধ হবে না। সুতরাং এটি নিরাপদ নয়?

vector<int> v;
v.push_back(1);
v.reserve(v.size() + 1);
v.push_back(v[0]);

এটি নিরাপদ করে তোলে?


4
একটি দ্রষ্টব্য: মানক প্রস্তাব ফোরামে বর্তমানে আলোচনা চলছে। এর অংশ হিসাবে, কেউ এর একটি বাস্তবায়ন উদাহরণpush_back দিয়েছেন । অন্য একটি পোস্টার এতে একটি বাগ উল্লেখ করেছে , যেটি আপনি বর্ণনা করেছেন তা এটি সঠিকভাবে পরিচালনা করে না। অন্য কেউ, যতদূর আমি বলতে পারি, যুক্তি দিয়েছিলেন যে এটি কোনও বাগ ছিল না। এটি চূড়ান্ত প্রমাণ নয়, কেবল একটি পর্যবেক্ষণ saying
বেনজামিন লিন্ডলি

9
আমি দুঃখিত তবে সঠিক উত্তর নিয়ে এখনও বিতর্ক আছে বলে কোন উত্তর গ্রহণ করতে হবে তা আমি জানি না।
নীল কিরক

4
আমাকে এই প্রশ্নের উপরে 5 ম মন্তব্য দ্বারা মন্তব্য করতে বলা হয়েছিল: stackoverflow.com/a/18647445/576911 এর অধীনে । আমি বর্তমানে প্রতিটি উত্তরকে উচ্চারণ করে এটি করছি: হ্যাঁ, একই ভেক্টর থেকে কোনও উপাদান ধাক্কা দেওয়া নিরাপদ।
হাওয়ার্ড হিন্নন্ত

2
@ বেনভয়েগ্ট: <শ্রোগ> আপনি যদি স্ট্যান্ডার্ড যা বলে তার সাথে একমত না হন, বা আপনি যদি মানদণ্ডের সাথে একমত হন, তবে এটির পক্ষে এটি যথেষ্ট স্পষ্টভাবে বলেছে বলে মনে করেন না, তবে এটি সর্বদা আপনার জন্য একটি বিকল্প: cplusplus.github.io/LWG/ lwg-active.html # submit_issue আমি এই অপশনটি আমার মনে রাখার চেয়ে অনেক বেশি সময় নিয়েছি। কখনও সাফল্যের সাথে, কখনও কখনও না। যদি আপনি স্ট্যান্ডার্ড কী বলে বা কী বলা উচিত তা নিয়ে বিতর্ক করতে চান, এসও কার্যকর ফোরাম নয়। আমাদের কথোপকথনের কোনও আদর্শিক অর্থ নেই। তবে উপরের লিঙ্কটি অনুসরণ করে আপনি কোনও আদর্শিক প্রভাবের সুযোগ পেতে পারেন।
হাওয়ার্ড হিন্যান্ট

2
@ পোলারিস ৮৮৮ যদি ধাক্কা_ব্যাক্ট ভেক্টরকে তার সক্ষমতা পর্যন্ত পৌঁছে দেয়, ভেক্টর একটি নতুন বড় বাফার বরাদ্দ করবে, পুরানো ডেটা অনুলিপি করবে এবং তারপরে পুরানো বাফার মুছে ফেলবে। তারপরে এটি নতুন উপাদানটি সন্নিবেশ করবে। সমস্যাটি হ'ল, নতুন উপাদানটি পুরানো বাফারের ডেটার উল্লেখ যা এখনই মুছে ফেলা হয়েছে। মুছে ফেলার আগে পুশ_ব্যাক মানটির একটি অনুলিপি না দিলে এটি একটি খারাপ রেফারেন্স হবে।
নিল কির্ক

উত্তর:


31

দেখে মনে হচ্ছে http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#526 স্ট্যান্ডার্ডের একটি সম্ভাব্য ত্রুটি হিসাবে এই সমস্যাটিকে (বা এর সাথে খুব সামান্য কিছু) সম্বোধন করেছে:

1) কনস্ট্যান্ট রেফারেন্সের দ্বারা গৃহীত প্যারামিটারগুলি কার্য সম্পাদনের সময় পরিবর্তন করা যেতে পারে

উদাহরণ:

দেওয়া হয়েছে স্ট্যান্ড :: ভেক্টর ভি:

v.insert (v.begin (), v [2]);

v [2] ভেক্টরের উপাদানগুলি পরিবর্তন করে পরিবর্তন করা যেতে পারে

প্রস্তাবিত প্রস্তাবটি ছিল যে এটি কোনও ত্রুটি ছিল না:

ভেক্টর :: সন্নিবেশ (এটির, মান) প্রয়োজন কারণ মানক এটি কাজ না করার অনুমতি দেয় না।


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

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

3
@NeilKirk আমার মনে হয় authorative উত্তর হওয়া উচিত, এটি স্টিফেন টি Lavavej দ্বারা উল্লেখ করা হয় Reddit এ মূলত একই আর্গুমেন্ট ব্যবহার করে।
TemplateRex

v.insert(v.begin(), v[2]);একটি পুনর্বিবেচনা ট্রিগার করতে পারে না। সুতরাং কিভাবে এই প্রশ্নের উত্তর দেয়?
থমাসম্যাকলিউড

@ থমাস এমসিএলিড: হ্যাঁ এটি স্পষ্টতই একটি পুনঃব্যবস্থাপনা শুরু করতে পারে। আপনি একটি নতুন উপাদান byোকিয়ে ভেক্টরের আকার প্রসারিত করছেন।
ভায়োলেট জিরাফ

21

হ্যাঁ, এটি নিরাপদ এবং স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়নগুলি এটির জন্য হুপসের মধ্য দিয়ে ঝাঁপিয়ে পড়ে।

আমি বিশ্বাস করি যে প্রয়োগকারীরা এই প্রয়োজনীয়তাটি কোনওভাবে 23.2 / 11 এ সন্ধান করতে পারেন তবে আমি কীভাবে তা নির্ধারণ করতে পারি না এবং আমি আরও কংক্রিটের কিছু খুঁজে পাচ্ছি না। সবচেয়ে ভাল আমি খুঁজে পেতে পারেন এই নিবন্ধ:

http://www.drdobbs.com/cpp/copying-container-elements-from-the-c-li/240155771

Libc ++ এর এবং libstdc ++ এর বাস্তবায়নগুলি পরিদর্শন করে যে তারা নিরাপদও রয়েছে।


9
কিছু সমর্থন এখানে সত্যিই সাহায্য করবে।
ক্রিস

3
এটি আকর্ষণীয়, আমি অবশ্যই স্বীকার করব যে আমি কখনও মামলাটি বিবেচনা করি নি তবে অবশ্যই এটি অর্জন করা বেশ কঠিন বলে মনে হচ্ছে। এটিও ধরে রাখে vec.insert(vec.end(), vec.begin(), vec.end());?
ম্যাথিউ এম।

2
@MatthieuM। নং: সারণি 100 বলেছেন: "প্রাক: i এবং j একটিতে পুনরাবৃত্তিকারী নয়"।
সেবাস্তিয়ান রেডল

2
আমি এখন উত্সাহ দিচ্ছি কারণ এটি আমার স্মৃতিচারণও, তবে একটি রেফারেন্স প্রয়োজন।
bames53

3
২৩.২ / ১১ সংস্করণে আপনি "অন্যথায় নির্দিষ্ট না হলে (অন্যথায় স্পষ্টভাবে বা অন্য ফাংশনের সাথে কোনও ফাংশন সংজ্ঞায়িত করে) ব্যবহার করছেন, কোনও ধারক সদস্য ফাংশন প্রার্থনা করা বা একটি পাত্রে কোনও লাইব্রেরি ফাংশনের যুক্তি হিসাবে পাস করা পুনরাবৃত্তিকে অবৈধ করে না সেই ধারকটির মধ্যে অবজেক্টের মান বা পরিবর্তন করতে "। ? তবে vector.push_backঅন্যথায় নির্দিষ্ট করে। "পুরানো ক্ষমতার চেয়ে নতুন আকার বড় হলে পুনঃনির্ধারণের কারণ হয়।" এবং (এ reserve) "পুনঃনির্ধারণটি ক্রমের সমস্ত উপাদানগুলিকে উল্লেখ করে সমস্ত রেফারেন্স, পয়েন্টার এবং পুনরাবৃত্তিকে অবৈধ করে দেয়।"
বেন ভয়েগট

13

মানটি আপনার প্রথম উদাহরণটি সুরক্ষিত থাকার নিশ্চয়তা দেয়। সি ++ 11 উদ্ধৃত করা হচ্ছে

[Sequence.reqmts]

3 সারণি 100 এবং 101 এ ... Xএকটি সিকোয়েন্স কনটেইনার শ্রেণি aবোঝায় X, প্রকারের উপাদানগুলির সমন্বিত মানকে বোঝায় T... ... tএকটি মান বা কোষের মূল্যকে বোঝায়X::value_type

16 টেবিল 101 ...

এক্সপ্রেশন a.push_back(t) রিটার্ন টাইপ void পরিচালনাগত শব্দার্থবিদ্যা একটি কপি আপনার স্বাক্ষরে t. প্রয়োজন: T হইবে CopyInsertableমধ্যে Xকনটেইনার basic_string , deque, list,vector

সুতরাং যদিও এটি একেবারে তুচ্ছ নয়, বাস্তবায়ন অবশ্যই গ্যারান্টি দেয় যে এটি করার সময় এটি রেফারেন্সকে অকার্যকর করবে না push_back


7
এটি কীভাবে এটি নিরাপদ থাকার গ্যারান্টি দেয় আমি তা দেখতে পাচ্ছি না।
jrok

4
@ অ্যাঙ্গিউ: এটি সম্পূর্ণরূপে অবৈধ করে দেয় t, অনুলিপিটি তৈরি করার আগে বা পরে একটাই প্রশ্ন। আপনার শেষ বাক্যটি অবশ্যই ভুল।
বেন ভয়েগ্ট

4
@ বেনভয়েগ্ট যেহেতু tবর্ণিত আচরণের গ্যারান্টিযুক্ত তালিকাভুক্ত পূর্বশর্তগুলি পূরণ করে। কোনও বাস্তবায়নকে পূর্ব শর্ত অকার্যকর করার অনুমতি দেওয়া হয় না এবং তারপরে নির্দিষ্ট হিসাবে আচরণ না করার অজুহাত হিসাবে এটি ব্যবহার করুন।
bames53

8
@ বেনভয়েগ্ট ক্লায়েন্টকে পুরো কল জুড়ে পূর্ব শর্ত বজায় রাখতে বাধ্য নয়; কেবলমাত্র কলটির সূচনায় এটি পূরণ হয়েছে তা নিশ্চিত করার জন্য।
bames53

6
@ বেনভয়েগ্ট এটি একটি ভাল পয়েন্ট তবে আমি বিশ্বাস করি যে এখানে যে ফান্টারটি পাস করেছে for_eachতাকে পুনরাবৃত্তিকারীদের অকার্যকর করতে হবে না। আমি এর জন্য একটি রেফারেন্স নিয়ে আসতে পারছি না for_eachতবে আমি কিছু অ্যালগরিদম পাঠ্যে দেখতে পাই যেমন "ওপ এবং বাইনারি_পোকটি পুনরাবৃত্তকারী বা সাব্রেনজগুলি অকার্যকর করে না"।
bames53

7

এটি স্পষ্ট নয় যে প্রথম উদাহরণটি নিরাপদ, কারণ এর সহজতম বাস্তবায়ন হ'ল push_backপ্রথমে ভেক্টরটিকে পুনরায় গণনা করা প্রয়োজন, যদি প্রয়োজন হয়, এবং তারপরে রেফারেন্সটি অনুলিপি করা।

তবে কমপক্ষে এটি ভিজ্যুয়াল স্টুডিও ২০১০ এর সাথে নিরাপদ বলে মনে হচ্ছে you push_backযখন আপনি ভেক্টরটিতে কোনও উপাদানকে পিছনে ফেলে দেবেন তখন এর প্রয়োগটি কেসটির বিশেষ পরিচালনা করে। কোডটি নিম্নরূপে কাঠামোযুক্ত:

void push_back(const _Ty& _Val)
    {   // insert element at end
    if (_Inside(_STD addressof(_Val)))
        {   // push back an element
                    ...
        }
    else
        {   // push back a non-element
                    ...
        }
    }

8
আমি জানতে চাই যে স্পেসিফিকেশনটির এটি নিরাপদ হওয়া দরকার।
নওয়াজ

1
স্ট্যান্ডার্ড অনুযায়ী এটি নিরাপদ থাকার প্রয়োজন হয় না। তবে এটি নিরাপদ উপায়ে কার্যকর করা সম্ভব।
বেন ভয়েগট

2
@BenVoigt আমি বলতে চাই এটা করা হয় নিরাপদ হতে প্রয়োজনীয় (আমার উত্তর দেখুন)।
অ্যাঞ্জিউ আর

2
@ বেনভয়েগ্ট আপনি রেফারেন্সটি পাস করার সময় এটি বৈধ।
অ্যাঞ্জিউ আর

4
@ অ্যাঞ্জিউ: এটি যথেষ্ট নয়। আপনার একটি রেফারেন্স পাস করতে হবে যা কলটির সময়কালের জন্য বৈধ থাকে, এবং এইটি দেয় না।
বেন ভয়েগট

3

এটি স্ট্যান্ডার্ডের কোনও গ্যারান্টি নয়, তবে অন্য ডেটা পয়েন্ট হিসাবে, এলএলভিএমের লিবিসি ++ এরv.push_back(v[0]) জন্য নিরাপদ ।

libc ++ এরstd::vector::push_back কলগুলি __push_back_slow_pathযখন মেমরিটি পুনর্বিবেচনার প্রয়োজন হয়:

void __push_back_slow_path(_Up& __x) {
  allocator_type& __a = this->__alloc();
  __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), 
                                                  size(), 
                                                  __a);
  // Note that we construct a copy of __x before deallocating
  // the existing storage or moving existing elements.
  __alloc_traits::construct(__a, 
                            _VSTD::__to_raw_pointer(__v.__end_), 
                            _VSTD::forward<_Up>(__x));
  __v.__end_++;
  // Moving existing elements happens here:
  __swap_out_circular_buffer(__v);
  // When __v goes out of scope, __x will be invalid.
}

অনুলিপিটি কেবলমাত্র বিদ্যমান স্টোরেজকে বিলোপ করার আগেই তৈরি করতে হবে না, বিদ্যমান উপাদানগুলি থেকে সরানোর আগে। আমি মনে করি বিদ্যমান উপাদানগুলির সরানো কাজটি সম্পন্ন হয়েছে __swap_out_circular_buffer, এক্ষেত্রে এই বাস্তবায়নটি অবশ্যই নিরাপদ।
বেন ভয়েগট

@ বেনভয়েগট: ভাল কথা, আপনি সত্যিই সঠিক যে চলন্তটি ভিতরে ঘটে __swap_out_circular_buffer। (আমি এটিতে কিছু মন্তব্য যুক্ত করেছি))
নাট কোহল

1

প্রথম সংস্করণ অবশ্যই নিরাপদ নয়:

স্ট্যান্ডার্ড লাইব্রেরী ধারক বা স্ট্রিং সদস্য ফাংশন কল করে পুনরাবৃত্তকারীদের উপর পরিচালনগুলি অন্তর্নিহিত ধারকটিতে অ্যাক্সেস করতে পারে তবে এটিকে কোনও পরিবর্তন করবে না। [দ্রষ্টব্য: বিশেষত, ধারক অপারেশনগুলি যা কনটেনারের সাথে সম্পর্কিত পুনরাবৃত্তির সাথে অপারেশনগুলির সাথে পুনরাবৃত্তিকারীদের দ্বন্দ্ব করে। - শেষ নোট]

বিভাগ থেকে 17.6.5.9


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


1
এটি বোঝা উচিত যে এটি একটি নোট নয়, কোনও নিয়ম নয়, সুতরাং এটি পূর্বোক্ত নিয়মের একটি পরিণতি ব্যাখ্যা করছে ... এবং ফলাফলগুলি রেফারেন্সগুলির জন্য অভিন্ন।
বেন ভয়েগট

5
এর ফলাফল v[0]কোনও পুনরুক্তিকারী নয়, একইভাবে, push_back()একটি পুনরাবৃত্তি গ্রহণ করে না। সুতরাং, কোনও ভাষা আইনজীবীর দৃষ্টিকোণ থেকে আপনার যুক্তি বাতিল। দুঃখিত। আমি জানি যে, বেশিরভাগ পুনরাবৃত্তকারী পয়েন্টার এবং একটি পুনরুক্তিকারীকে অবৈধ করার বিন্দুটি উল্লেখের মতো একই, তবে আপনি যে স্ট্যান্ডার্ডটির উল্লেখ করেছেন তার অংশটি হাতের অবস্থার সাথে অপ্রাসঙ্গিক।
cmaster - পুনর্বহাল মনিকা

-1। এটি সম্পূর্ণ অপ্রাসঙ্গিক উক্তি এবং যাইহোক এটির উত্তর দেয় না। কমিটি বলছে x.push_back(x[0])নিরাপদ।
নওয়াজ

0

এটি সম্পূর্ণ নিরাপদ।

আপনার দ্বিতীয় উদাহরণ আপনি আছে

v.reserve(v.size() + 1);

যা প্রয়োজন হয় না কারণ যদি ভেক্টর এর আকারের বাইরে চলে যায় তবে এটি সূচিত করবে reserve

ভেক্টর এই জিনিসগুলির জন্য দায়বদ্ধ, আপনি নন।


-1

উভয়ই নিরাপদ কারণ পুশ_ব্যাক্ট রেফারেন্সটি নয়, মানটি অনুলিপি করবে। আপনি যদি পয়েন্টারগুলি সংরক্ষণ করছেন, তবে এটি ভেক্টর সম্পর্কিত যতটা নিরাপদ এখনও তা নিরাপদ তবে কেবল জেনে রাখুন যে আপনার ভেক্টরের দুটি উপাদান একই ডাটাতে নির্দেশ করবে।

বিভাগ 23.2.1 সাধারণ ধারক প্রয়োজনীয়তা

16
  • a.push_back (t) টি এর একটি অনুলিপি যুক্ত করে। প্রয়োজনীয়: টি এক্স এর মধ্যে অনুলিপিযোগ্য হবে T
  • a.push_back (rv) আরভি এর একটি অনুলিপি যুক্ত করে। প্রয়োজনীয়: টি এক্স এর মধ্যে মুভি-অন্তর্ভুক্তযোগ্য হবে T

পুশ_ব্যাকের প্রয়োগগুলি অবশ্যই একটি অনুলিপি প্রবেশ v[0] করানো হয়েছে তা নিশ্চিত করতে হবে । পাল্টা উদাহরণস্বরূপ, এমন একটি বাস্তবায়ন ধরে নেওয়া যা অনুলিপি করার আগে পুনরায় প্রকাশ হবে, এটি অবশ্যই একটি অনুলিপি v[0]এবং এর ফলে চশমা লঙ্ঘন করবে না।


2
push_backতবে ভেক্টরটির আকারও পরিবর্তন করবে এবং একটি অনর্থক বাস্তবায়নে অনুলিপি হওয়ার আগে এটি রেফারেন্সকে অকার্যকর করে দেবে। সুতরাং যদি না আপনি মানটিকে উদ্ধৃতি দিয়ে ব্যাক আপ করতে না পারেন, আমি এটিকে ভুল বিবেচনা করব।
কনরাড রুডল্ফ

4
"এটি" দ্বারা, আপনি প্রথম বা দ্বিতীয় উদাহরণটি বোঝাতে চান? push_backভেক্টরে মানটি অনুলিপি করবে; তবে (যতদূর আমি দেখতে পাচ্ছি) যা পুনঃনির্ধারণের পরে ঘটতে পারে , যার রেফারেন্সটি থেকে এটি অনুলিপি করার চেষ্টা করছে সেটি আর বৈধ নয়।
মাইক সিমুর

1
push_backরেফারেন্স দ্বারা তার যুক্তি প্রাপ্ত ।
bames53

1
@ অলিভিডারডি: এটিতে (1) নতুন স্থান বরাদ্দ করতে হবে (2) নতুন উপাদানটি অনুলিপি করতে হবে (3) বিদ্যমান উপাদানগুলি সরানো-নির্মাণ করা (4) সরিয়ে নেওয়া উপাদানগুলি নষ্ট করতে হবে (5) পুরাতন স্টোরেজকে মুক্ত করতে হবে - এটি যাতে - প্রথম সংস্করণ কাজ করতে।
বেন ভয়েগট

1
@ বেনওয়েগ্ট অন্য কোনও পাত্রে কেন এমন প্রয়োজন হবে যে কোনও ধরণের কপিইনটেস্টেবল হ'ল যদি তা সেই সম্পত্তিটিকে পুরোপুরি উপেক্ষা করে চলেছে?
অলিভিয়েরডি

-2

23.3.6.5/1 থেকে: Causes reallocation if the new size is greater than the old capacity. If no reallocation happens, all the iterators and references before the insertion point remain valid.

যেহেতু আমরা শেষে সন্নিবেশ করছিলাম, তাই ভেক্টরকে পুনরায় আকার না দেওয়া হলে কোনও উল্লেখ অকার্যকর হবে না। সুতরাং যদি ভেক্টর এর capacity() > size()পরে এটি কাজ করার গ্যারান্টিযুক্ত, অন্যথায় এটি অপরিজ্ঞাত আচরণের গ্যারান্টিযুক্ত।


আমি বিশ্বাস করি যে স্পেসিফিকেশনটি এটি উভয় ক্ষেত্রেই কাজ করার নিশ্চয়তা দেয়। আমি যদিও একটি রেফারেন্সের জন্য অপেক্ষা করছি।
bames53

প্রশ্নে পুনরাবৃত্তকারী বা পুনরাবৃত্তির সুরক্ষার উল্লেখ নেই।
অলিভিডার

3
@ অলিভিয়ারডি পুনরুক্তি অংশটি এখানে অতিরিক্ত প্রয়োজন: আমি referencesউদ্ধৃতিটির অংশে আগ্রহী ।
মার্ক বি

2
এটি আসলে নিরাপদ থাকার গ্যারান্টিযুক্ত (আমার উত্তর দেখুন, এর শব্দার্থক push_back)।
অ্যাঞ্জিউ আর তাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.