আসুন এই দাবিকে প্রকৃত পরিমাপযোগ্য ঘটনা হিসাবে ভেঙে দিন:
- লাইটার: কিউটি কনটেইনারগুলি এসটিএল ধারকগুলির চেয়ে কম মেমরি ব্যবহার করে
- নিরাপদ: কিউটি পাত্রে অপ্রতুলভাবে ব্যবহার করার সুযোগ কম রয়েছে
- আরও সহজ: কিউটি পাত্রে কোনও বৌদ্ধিক বোঝা কম পাওয়া যায়
সহজ
এই প্রসঙ্গে দাবি করা হয়েছে যে জাভা-স্টাইলের পুনরাবৃত্তিটি কোনওভাবে এসটিএল স্টাইলের চেয়ে "সহজ", এবং তাই এই অতিরিক্ত ইন্টারফেসের কারণে Qt ব্যবহার করা সহজ।
জাভা স্টাইল:
QListIterator<QString> i(list);
while (i.hasNext())
qDebug() << i.next();
এসটিএল স্টাইল:
QList<QString>::iterator i;
for (i = list.begin(); i != list.end(); ++i)
qDebug << *i;
জাভা পুনরায় শৈলীতে কিছুটা ছোট এবং পরিষ্কার হওয়ার সুবিধা রয়েছে। সমস্যাটি হচ্ছে, এটি আসলে আর এসটিএল স্টাইল নয়।
সি ++ 11 এসটিএল স্টাইল
for( auto i = list.begin(); i != list.end(); ++i)
qDebug << *i;
অথবা
সি ++ 11 পূর্বাভাস শৈলী
for (QString i : list)
qDebug << i;
যা এত মারাত্মকভাবে সহজ যে কোনও কিছু ব্যবহার করার কোনও কারণ নেই (যদি আপনি সি ++ 11 সমর্থন না করেন)।
আমার প্রিয়, তবে:
BOOST_FOREACH(QString i, list)
{
qDebug << i;
}
সুতরাং, যেমন আমরা দেখতে পাচ্ছি, এই ইন্টারফেসটি ইতিমধ্যে মসৃণ, প্রবাহিত এবং আধুনিক ইন্টারফেসের উপরে একটি অতিরিক্ত ইন্টারফেস ছাড়া আমাদের কিছুই অর্জন করে না। ইতিমধ্যে স্থিতিশীল এবং ব্যবহারযোগ্য ইন্টারফেসের শীর্ষে বিমূর্ততার অপ্রয়োজনীয় স্তর যুক্ত করা হচ্ছে? "সহজ" সম্পর্কে আমার ধারণা নয়।
এছাড়াও, কিউটি ফোরচ এবং জাভা ইন্টারফেসগুলি ওভারহেড যুক্ত করে; তারা কাঠামোটি অনুলিপি করে এবং একটি অপ্রয়োজনীয় স্তর নির্দেশনা সরবরাহ করে। এটি সম্ভবত খুব বেশি মনে হচ্ছে না, তবে কেন না খুব বেশি সরল ইন্টারফেসের জন্য ওভারহেডের একটি স্তর যুক্ত করুন? জাভা এই ইন্টারফেস আছে কারণ জাভা অপারেটর ওভারলোডিং নেই; সি ++ করে।
নিরাপদ
কিউটি যে ন্যায়সঙ্গততা দেয় তা হ'ল অন্তর্নিহিত ভাগ করে নেওয়ার সমস্যা, যা অন্তর্ভুক্ত নয় সমস্যাও নয়। যদিও এটি ভাগ করে নেওয়ার সাথে জড়িত।
QVector<int> a, b;
a.resize(100000); // make a big vector filled with 0.
QVector<int>::iterator i = a.begin();
// WRONG way of using the iterator i:
b = a;
/*
Now we should be careful with iterator i since it will point to shared data
If we do *i = 4 then we would change the shared instance (both vectors)
The behavior differs from STL containers. Avoid doing such things in Qt.
*/
প্রথমত, এটি অন্তর্নিহিত নয়; আপনি স্পষ্টভাবে একজন ভেক্টরকে অন্য একজনকে নিযুক্ত করছেন। এসটিএল পুনরাবৃত্তকারী স্পেসিফিকেশন স্পষ্টভাবে ইঙ্গিত দেয় যে পুনরাবৃত্তকারীরা ধারকটির অন্তর্ভুক্ত, সুতরাং আমরা স্পষ্টভাবে খ এবং ক এর মধ্যে একটি ভাগ করা ধারক প্রবর্তন করেছি। দ্বিতীয়ত, এটি কোনও সমস্যা নয়; যতক্ষণ না পুনরুক্তি সংক্রান্ত স্পেসিফিকেশনের সমস্ত নিয়ম অনুসরণ করা হয়, ততক্ষণ কোনও কিছুই ভুল হবে না। কেবলমাত্র কিছু সময় ভুল হওয়ার পরে এখানে:
b.clear(); // Now the iterator i is completely invalid.
কিউটি এটি নির্দিষ্ট করে যেমন এটির অর্থ কিছু, যেমন একটি পরিস্থিতি থেকে এই সমস্যাটি দেখা দেয় de এটা হয় না। পুনরুক্তিকারীকে অবৈধ করা হয়েছে, এবং একাধিক বিচ্ছিন্ন অঞ্চল থেকে অ্যাক্সেস করা যায় এমন কোনও কিছুর মতো, এটি ঠিক কীভাবে এটি কাজ করে। প্রকৃতপক্ষে, এটি Qt- তে জাভা শৈলীর পুনরাবৃত্তকারীগুলির সাথে সহজেই উপস্থিত হবে, এটি অন্তর্নিহিত ভাগ করে নেওয়ার উপর প্রচুর নির্ভরতার জন্য ধন্যবাদ, যা এখানে ডকুমেন্ট হিসাবে একটি প্রতিরোধী এবং অন্যান্য অনেক ক্ষেত্রে রয়েছে । বিশেষত এই "অপ্টিমাইজেশান "টির কাঠামোটিতে মাল্ট্রিথ্রেডিংয়ের দিকে আরও বেশি করে সরিয়ে রাখার জন্য এটি ব্যবহার করা বিশেষত বিস্ময়কর বলে মনে হচ্ছে, তবে এটি আপনার জন্য বিপণন।
লাইটার
এটি একটি সামান্য কৌশলযুক্ত। অনুলিপি-অন-লেখার ব্যবহার এবং নিখরচায় ভাগ করে নেওয়ার এবং বৃদ্ধির কৌশলগুলি আপনার ধারক যে কোনও সময়ে কতটা মেমরি ব্যবহার করবে সে সম্পর্কে গ্যারান্টি দেওয়া আসলে খুব কঠিন করে তোলে। এটি এসটিএল থেকে পৃথক, যা আপনাকে শক্তিশালী অ্যালগরিদমিক গ্যারান্টি দেয়।
আমরা জানি যে কোনও ভেক্টরের জন্য নষ্ট স্থানের সর্বনিম্ন সীমাটি ভেক্টরের দৈর্ঘ্যের বর্গমূল , তবে কিউটিতে এটি প্রয়োগের কোনও উপায় নেই বলে মনে হয়; তারা সমর্থন করে এমন বিভিন্ন "অপ্টিমাইজেশন" এই অত্যন্ত গুরুত্বপূর্ণ স্থান সাশ্রয়কারী বৈশিষ্ট্যটিকে আটকায়। এসটিএলটির এই বৈশিষ্ট্যটির প্রয়োজন নেই (এবং সর্বাধিক দ্বিগুণ বৃদ্ধির ব্যবহার করা হয়, যা আরও অপব্যয়যোগ্য) তবে এটি লক্ষ করা গুরুত্বপূর্ণ যে আপনি যদি প্রয়োজন হয় তবে কমপক্ষে এই বৈশিষ্ট্যটি প্রয়োগ করতে পারেন।
দ্বিগুণ সংযুক্ত তালিকার ক্ষেত্রেও একই কথা, যা ব্যবহৃত স্থানকে হ্রাস করতে XOr লিঙ্কিং ব্যবহার করতে পারে। আবার, Qt এর সাথে এটি অসম্ভব, কারণ এটির বৃদ্ধি এবং COW এর প্রয়োজনীয়তা রয়েছে।
COW প্রকৃতপক্ষে কিছু হালকা করতে পারে তবে বুট দ্বারা সমর্থিত ইন্ট্রাসিভ কনটেইনারগুলিও এটি করতে পারে এবং পূর্ববর্তী সংস্করণগুলিতে কিউএটি প্রায়শই এটি ব্যবহার করা হয় তবে এগুলি আর ব্যবহার করা হয় না কারণ তারা ব্যবহার করা শক্ত, অনিরাপদ এবং ভার চাপিয়ে দেয় are প্রোগ্রামার উপর। গিরি একটি অনেক কম অনুপ্রবেশজনক সমাধান, তবে উপরে উত্থাপিত কারণে অপ্রয়োজনীয়।
আপনি কোনও নির্দিষ্ট সময়ে আপনি কতটা স্মৃতি নষ্ট করবেন তা জেনে রাখার অতিরিক্ত সুবিধা সহ আপনি একই মেমরির ব্যয় বা কিউটি এর কন্টেইনারগুলির চেয়ে কম এসটিএল কনটেইনারগুলি ব্যবহার করতে না পারার কোনও কারণ নেই। দুর্ভাগ্যক্রমে, দু'জনের কাঁচা মেমরির ব্যবহারের তুলনা করা অসম্ভব, কারণ এই জাতীয় মানদণ্ডগুলি বিভিন্ন ব্যবহারের ক্ষেত্রে বন্যপ্রাণে বিভিন্ন ফলাফল দেখায়, এটিই সঠিক সমস্যার সমাধান যা এসটিএলকে সংশোধন করার জন্য তৈরি করা হয়েছিল।
উপসংহারে
কোনও অনুলিপি ব্যয় ব্যয় না করে যখনই সম্ভব সম্ভব হয় তখন কিউইটি কনটেইনার ব্যবহার এড়িয়ে চলুন এবং যখনই সম্ভব সম্ভব এসটিএল টাইপ পুনরাবৃত্তি (সম্ভবত কোনও মোড়কের মাধ্যমে বা নতুন সিনট্যাক্সের মাধ্যমে) ব্যবহার করুন।