Ios_base এর তাত্পর্য :: সিঙ্ক_ইথ_স্টডিও (মিথ্যা); cin.tie (নাল);


146

অন্তর্ভুক্ত করার তাৎপর্য কী

ios_base::sync_with_stdio(false);
cin.tie(NULL);

সি ++ প্রোগ্রামে?

আমার পরীক্ষাগুলিতে এটি কার্যকর করার সময়টির গতি বাড়ায়, তবে এখানে কি পরীক্ষার কেস রয়েছে যা আমি অন্তর্ভুক্ত করে উদ্বিগ্ন হওয়া উচিত?

2 টি বিবৃতি সর্বদা একসাথে থাকতে হবে, বা প্রথমটি যথেষ্ট, অর্থাত্ উপেক্ষা করা উচিত cin.tie(NULL)?

এছাড়াও, যদি এর মান সেট করা থাকে তবে একযোগে সি এবং সি ++ কমান্ড ব্যবহার করা কি জায়েজ false?

https://www.codechef.com/viewsolution/7316085

উপরের কোডটি দুর্দান্ত কাজ করেছে, যতক্ষণ না আমি scanf/printfমান হিসাবে সি ++ প্রোগ্রামে ব্যবহার করি true। এই ক্ষেত্রে এটি একটি সেগমেন্টেশন ত্রুটি দিয়েছে। এর সম্ভাব্য ব্যাখ্যা কী হতে পারে?


আপনি আসলে এটি মিথ্যা দিয়ে ব্যবহার করেছেন। আপনার কোড তাই বলে ???
সুরজ জৈন

উত্তর:


231

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

ios_base::sync_with_stdio(false);

এটি সি এবং সি ++ স্ট্যান্ডার্ড স্ট্রিমের মধ্যে সিঙ্ক্রোনাইজেশন অক্ষম করে। ডিফল্টরূপে, সমস্ত স্ট্যান্ডার্ড স্ট্রিমগুলি সিঙ্ক্রোনাইজ করা হয়, যা অনুশীলনে আপনাকে সি- এবং সি ++ - শৈলী I / O মিশ্রিত করতে এবং সংবেদনশীল এবং প্রত্যাশিত ফলাফল পেতে দেয়। আপনি যদি সিঙ্ক্রোনাইজেশন অক্ষম করেন, তবে সি ++ স্ট্রিমগুলিতে তাদের নিজস্ব স্বতন্ত্র বাফার থাকার অনুমতি দেওয়া হবে যা সি- এবং সি ++ - শৈলীর I / O মিশ্রণ তৈরি করে।

এছাড়াও মনে রাখবেন যে সিঙ্ক্রোনাইজ করা সি ++ স্ট্রিমগুলি থ্রেড-সেফ রয়েছে (বিভিন্ন থ্রেড থেকে আউটপুট ইন্টারলিভ করতে পারে তবে আপনি কোনও ডেটা রেস পান না)।

cin.tie(NULL);

এই unties cinথেকে cout। বাঁধা স্ট্রিমগুলি নিশ্চিত করে যে অন্য স্ট্রিমের প্রতিটি আই / ও অপারেশনের আগে একটি স্ট্রিম স্বয়ংক্রিয়ভাবে ফ্লাশ হয়ে গেছে।

বুদ্ধিমান ব্যবহারকারীর ইন্টারঅ্যাকশন নিশ্চিত cinকরতে ডিফল্টরূপে বাঁধা হয় cout। উদাহরণ স্বরূপ:

std::cout << "Enter name:";
std::cin >> name;

যদি cinএবং coutবাঁধা থাকে, প্রোগ্রামটি ব্যবহারকারী থেকে ইনপুট অনুরোধ করার আগে আপনি আউটপুটটি ফ্লাশ হয়ে যাওয়ার আশা করতে পারেন (অর্থাত্ কনসোলটিতে দৃশ্যমান)। আপনি যদি স্ট্রিমগুলি মুক্ত করেন তবে প্রোগ্রামটি ব্যবহারকারী তাদের নাম প্রবেশের অপেক্ষায় অবরুদ্ধ হতে পারে তবে "নাম লিখুন" বার্তাটি এখনও দৃশ্যমান নয় (কারণ coutডিফল্ট অনুসারে বাফার করা হয়, শুধুমাত্র চাহিদা অনুযায়ী বা আউটপুট কনসোলে প্রদর্শিত হয় / যখন প্রদর্শিত হয়) বাফার পূর্ণ।

তাই আপনি যদি আলান যদি cinথেকে cout, আপনি কি নিশ্চিত ঘনিষ্ঠরূপে করতে হবে coutনিজে প্রত্যেক সময় আপনি ইনপুট আশা সামনে কিছু প্রদর্শন করাতে চান cin

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


আপনি যখন বলেন "আপনি যখন অবশ্যই সিনে ইনপুট প্রত্যাশার আগে কিছু প্রদর্শন করতে চান তখন অবশ্যই আপনাকে ম্যানুয়ালি ফ্লাশ করতে হবে", এটি সংযোজনের মতো সহজ হতে পারে "... << স্টাড :: ফ্লাশ" বা "... < <std :: endl "প্রতিটি লাইনের শেষে" std :: cout << ... "শুরু হয়, তাই না?
অ্যালান

4
হ্যাঁ, এটি এতটা সহজ তবে "প্রতিটি লাইনের শেষ" অংশের সাথে সাবধানতা অবলম্বন করুন। coutএকটি কারণে বাফার করা হয়, আপনি যদি খুব বেশি বার এটি ফ্লাশ করেন, যখন আপনার আসলে এটির প্রয়োজন হয় না, আপনি একটি পারফরম্যান্স হিট দেখতে পারেন।
আয়নট

@ আইনেট স্ক্যান, প্রিন্টফের জন্য সি তে টাই () কার্যকারিতা সমান কিছু আছে?
iajnr

1
@iajnr না, সরাসরি না সি-তে আপনি নিজে আগে ফ্লাশ করতে পারেন scanf(), পুরোপুরি বাফারিং অক্ষম করতে পারেন বা লাইন বাফারিংয়ে স্যুইচ করতে পারেন (যা নিউলাইনের পরে ফ্লাশ হওয়া উচিত বা যখন ইনপুটটি পড়া হয় stdin- লিনাক্স.ডিআইএন / ম্যান / ৩ / সেটলাইন বুফ দেখুন )।
আয়নট

1
লেটকোডে এটি রানটাইমের উল্লেখযোগ্যভাবে উন্নতি করে, সম্ভবত এই প্রতিযোগিতামূলক ওয়েবসাইটগুলি ইনপুট পরীক্ষার জন্য বিশেষ কিছু করে।
P0W

17

এটি সি এবং সি ++ বিশ্ব থেকে আইওগুলি সিঙ্ক্রোনাইজ করা। আপনি যদি সিঙ্ক্রোনাইজ করেন তবে আপনার গ্যারান্টি রয়েছে যে সমস্ত আইওর আদেশগুলি আপনার প্রত্যাশাটি ঠিক তাই। সাধারণভাবে, সমস্যাটি হ'ল আইওগুলির বাফারিং যা সমস্যার সৃষ্টি করে, সিঙ্ক্রোনাইজ করে উভয় জগতকে একই বাফার ভাগ করতে দেয়। যেমন cout << "Hello"; printf("World"); cout << "Ciao";; সিঙ্ক্রোনাইজেশন ছাড়া জানতে পারবে না যদি আপনি পাবেন HelloCiaoWorldবা HelloWorldCiaoবা WorldHelloCiao...

tieআপনাকে গ্যারান্টিটি পেতে দেয় যে সি ++ বিশ্বের আইও চ্যানেলগুলি একে অপরের সাথে আবদ্ধ হয়, যার অর্থ প্রতিটি আউটপুট ইনপুট সংঘটিত হওয়ার আগেই ফ্লাশ হয়ে গেছে (ভেবে দেখুন cout << "What's your name ?"; cin >> name;)।

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


3
এমনকি সিঙ্ক্রোনাইজেশন ছাড়াও, বিভিন্ন কলগুলি cout <<ক্রম পরিবর্তন করতে পারে না সুতরাং CiaoHelloWorldআপনার উদাহরণের ক্ষেত্রে এটি সম্ভব নয়। সিঙ্ক্রোনাইজেশন কঠোরভাবে বিভিন্ন বাফারিং পদ্ধতি সম্পর্কে।
মিক্কো রেন্টালাইনেন

3

এবং স্ট্রিমগুলি ios_base::sync_with_stdio(false);ডিকুয়াল করার জন্য ব্যবহার করা যথেষ্ট । ল্যাঙ্গার এবং ক্রেফ্টের মাধ্যমে আপনি স্ট্যান্ডার্ড সি ++ আইওএসট্রিম এবং লোকালগুলিতে এর একটি আলোচনা খুঁজে পেতে পারেন । তারা নোট করে যে এটি কীভাবে বাস্তবায়ন-সংজ্ঞায়িত হয়।CC++

cin.tie(NULL)কলের জন্য একটি কার্যক্রম মধ্যে decoupling অনুরোধ করা বলে মনে হয় cinএবং cout। অন্যান্য অপ্টিমাইজেশানের সাথে এটি ব্যবহার করা কেন ক্র্যাশের কারণ হতে পারে তা আমি ব্যাখ্যা করতে পারি না। যেমনটি উল্লেখ করা হয়েছে, আপনার সরবরাহিত লিঙ্কটি খারাপ, সুতরাং এখানে কোনও জল্পনা নেই।


0

এটা তোলে তৈরীর জন্য শুধু সাধারণ জিনিস Cin দ্রুত ইনপুট হবে।

দ্রুত ব্যাখ্যার জন্য: প্রথম লাইনটি সিন স্ট্রিম এবং সি-স্টাইলের স্টিডিও সরঞ্জামগুলির মধ্যে বাফার সিঙ্ক্রোনাইজেশন বন্ধ করে দেয় (যেমন স্ক্যানফ বা পায়) - সুতরাং সিন দ্রুত কাজ করে, তবে আপনি স্টডিও সরঞ্জামগুলির সাথে এটি একসাথে ব্যবহার করতে পারবেন না ।

দ্বিতীয় লাইন unties Cin থেকে cout - ডিফল্ট দ্বারা cout বাফার প্রতিটি সময় যখন আপনি কাছ থেকে কিছু পড়া flushes Cin । এবং এটি ধীর হতে পারে যখন আপনি বার বার ছোট কিছু পড়েন তখন অনেক বার ছোট কিছু লিখুন। এই সিঙ্ক্রোনাইজেশন বন্ধ লাইন পালাক্রমে (আক্ষরিক tying দ্বারা তা Cin করার নাল পরিবর্তে cout )।

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