এসটিএল বা কিউটি পাত্রে?


185

অনুকূল এবং কিউটি পাত্রে (ব্যবহারের কনস কি কি QMap, QVectorতাদের STL সমতুল্য উপর, ইত্যাদি)?

আমি কিউটি পছন্দ করার একটি কারণ দেখতে পাচ্ছি:

  • কিউটি কন্টেইনারগুলি Qt এর অন্যান্য অংশেও যেতে পারে। উদাহরণস্বরূপ, এগুলি একটি QVariantএবং তারপরে QSettings(কিছু সীমাবদ্ধতা সহ, কেবল QListএবং QMap/ QHashযার কীগুলি স্ট্রিং স্বীকৃত রয়েছে) ব্যবহার করতে ব্যবহৃত হতে পারে ।

অন্য কোন আছে?

সম্পাদনা : ধরে নিলাম অ্যাপ্লিকেশন ইতিমধ্যে Qt উপর নির্ভর করে।

উত্তর:


135

আমি std::(w)stringএবং এসটিএল কনটেইনারগুলি একচেটিয়াভাবে এবং কিউটি সমতুল্য থেকে / রূপান্তর করে শুরু করেছি , তবে আমি ইতিমধ্যে স্যুইচ QStringকরেছি এবং আমি দেখতে পেয়েছি যে আমি কিউ এর কনটেইনারটি আরও বেশি ব্যবহার করছি।

এটি স্ট্রিংয়ের ক্ষেত্রে আসে, QStringতুলনায় অনেক বেশি সম্পূর্ণ কার্যকারিতা সরবরাহ করে std::basic_stringএবং এটি সম্পূর্ণ ইউনিকোড সচেতন। এটি একটি দক্ষ COW বাস্তবায়নও দেয় , যা আমি প্রচুর উপর নির্ভর করতে এসেছি।

কিউটির পাত্রে:

  • QStringQW এর foreachম্যাক্রো (যা একটি অনুলিপি ব্যবহার করে) এবং মেটা-প্রকার বা সংকেত এবং স্লট ব্যবহার করার সময় এটি অত্যন্ত কার্যকর যখন একইরূপে COW বাস্তবায়ন সরবরাহ করে।
  • এসটিএল-স্টাইলের পুনরাবৃত্তকারী বা জাভা-শৈল পুনরাবৃত্তকারী ব্যবহার করতে পারেন
  • সঙ্গে প্রবাহিত হয় QDataStream
  • Qt এর API এ ব্যাপকভাবে ব্যবহৃত হয়
  • অপারেটিং সিস্টেম জুড়ে একটি স্থিতিশীল বাস্তবায়ন আছে। একটি এসটিএল বাস্তবায়ন অবশ্যই সি ++ স্ট্যান্ডার্ড মেনে চলবে, তবে এটি যেমন খুশি তেমন অন্যথায় std::stringনির্দ্বিধায় ( সিওডাব্লু বিতর্ক দেখুন)। কিছু এসটিএল বাস্তবায়ন বিশেষত খারাপ।
  • হ্যাশগুলি সরবরাহ করুন, যা আপনি টিআর 1 ব্যবহার না করে উপলভ্য নয়

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


12
নতুন স্ট্যান্ডার্ড সি ++ 0x COW টেবিলের বাইরে খুব বেশি।

16
পুনরায়: "সাবধানতার সাথে ন্যূনতম মেমরি ব্যবহারের জন্য ডিজাইন করা হয়েছে"। আপনার বিপণনে বিশ্বাস করা উচিত নয়। QList<double>নিজের জন্য মেমরি ব্যবহারের জন্য 32-বিট আর্কিটেকচারে প্রোফাইল ।
মার্ক মুটজ - মিমুতজ

11
"এটি একটি দক্ষ COW বাস্তবায়নও সরবরাহ করে": মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলির ক্ষেত্রে COW সব দক্ষ হয় না ...
গ্রিজলি

5
@ মার্কমুটজ-মিমুটজ এর QVectorপরিবর্তে প্রোফাইল চেষ্টা করুন QList। বেশিরভাগ কিউটি ব্যাখ্যা রয়েছে, যা কিউলিস্ট বস্তুগুলিতে পয়েন্টার সংরক্ষণের জন্য ডিজাইন করা হয়েছে। সুতরাং প্রতিটি ডাবল আইটেম গতিশীলভাবে তৈরি এবং এই আইটেমের পয়েন্টার এ সংরক্ষণ করা হয় QList। কিউলিস্টটি ভেক্টর এবং লিঙ্কযুক্ত তালিকার মধ্যে "মাঝারি" ধারক হিসাবে ডিজাইন করা হয়েছে। এটি মেমরি / পারফরম্যান্স সমালোচনামূলক ক্ষেত্রে ডিজাইন করা হয়নি।
দিমিত্রি সাজনোভ

2
@ user1095108 এর সাথে কোনও ভুল নেই। এসটিএল ব্যবহার করুন আমরা কেউ কেউ দ্রুত সঠিক কোড লেখা পছন্দ করি। এটির সাথে কোনও ভুল নেই।
weberc2

178

এটি প্রশ্নের উত্তর দেওয়া একটি কঠিন। এটি সত্যিই একটি দার্শনিক / বিষয়গত যুক্তিতে উত্সাহিত করতে পারে।

বলা হচ্ছে যে...

আমি "যখন রোমে থাকি ... রোমানদের মতো কর" নিয়মটি সুপারিশ করি

যার অর্থ আপনি যদি Qt জমিতে থাকেন তবে কোডটি Qt'ians যেমন করে। এটি কেবল পঠনযোগ্যতা / ধারাবাহিকতার উদ্বেগের জন্য নয়। আপনি যদি একটি স্টাইলের ধারক মধ্যে সবকিছু সঞ্চয় করেন তবে কি হবে তা বিবেচনা করুন তবে আপনাকে সেই সমস্ত ডেটা একটি Qt ফাংশনে স্থান দিতে হবে। আপনি কি সত্যিই এমন একটি কোডের গোছা পরিচালনা করতে চান যা Qt ধারকগুলিতে / আউট-এর জিনিসগুলি অনুলিপি করে। আপনার কোডটি ইতিমধ্যে কিউটি-র উপর নির্ভরশীল, সুতরাং স্টাইলের পাত্রে ব্যবহার করে আপনি এটিকে আরও "স্ট্যান্ডার্ড" বানানোর মতো নয়। এবং একটি ধারকটির কী কী যদি প্রতিবার আপনি কোনও দরকারী কাজের জন্য এটি ব্যবহার করতে চান, আপনাকে এটি সম্পর্কিত কিউটি ধারকটিতে অনুলিপি করতে হবে?


1
+1 আপনি পুরোপুরি ঠিক বলেছেন, আমি আমার প্রশ্নে এটি ব্যাখ্যা করার চেষ্টা করেছি ("আমি কিউটি পছন্দ করার জন্য একটি কারণ দেখতে পাচ্ছি") তাই আমি এটিকে সামান্য সম্পাদনা করেছি। ধন্যবাদ
জুলিয়েন-এল

একেবারে ঠিক বলেছেন। আপনি কিউটি করছেন, কিউটি স্টাফ ব্যবহার করুন! রক্ষণাবেক্ষণকারীর জন্য "ডাব্লুটিএফ" মুহুর্তটি কল্পনা করুন যখন তিনি একটি কিউটি অ্যাপ্লিকেশনটি খোলেন এবং কিউটি এবং এসটিএল বিনিময়যোগ্যভাবে দেখেন। এটি একটি (অপ্রয়োজনীয়) দুঃস্বপ্ন হয়ে যেতে পারে।
ItPete

5
@ ইটপিট এসটিএল মানের একটি অংশ; কিউটি হয় না। স্ট্যান্ডার্ডটি ব্যবহার করে এমন কোনও কোড কখনই "ডাব্লুটিএফ" মুহুর্তটিকে ট্রিগার করা উচিত নয়।
অ্যালিস

5
রোমানরা তাদের বন্দীদের কলোসিয়ামে ফেলেছিল এবং তারপরে সিংহের সাহায্যে তাদের শিকার করেছিল। আপনি যদি আরও ভাল জানেন তবে স্থানীয় অভ্যাসগুলি অনুসরণ করবেন না। এটি
কিউটিতে

1
@ মুমতুজ আপনি বলছেন যে এটি একটি খারাপ জিনিস, আমি এই কোলসিয়ামের মধ্যে কিছু কোড খুঁজে পেয়েছি এবং শোটি দেখতে চাই
slp

64

কিউটি কনটেইনারগুলি এসটিএলগুলির চেয়ে বেশি সীমিত। যেখানে এসটিএলগুলি উচ্চতর রয়েছে তার কয়েকটি উদাহরণ (এগুলির মধ্যে আমি আগে যা পড়েছি):

  • এসটিএল স্ট্যান্ডার্ড করা হয়েছে, প্রতিটি কিউটি সংস্করণ দিয়ে পরিবর্তন হয় না (কিউটি 2 ছিল QList(পয়েন্টার ভিত্তিক) এবং QValueList(মান-ভিত্তিক); কিউটি 3 ছিল QPtrListএবং QValueList; কিউটি 4 এখন রয়েছে QList, এবং এটি মোটামুটি QPtrList বা কিছুই নয় QValueList)।
    (। অর্থাত এমনকি যদি আপনি কিউটি পাত্রে ব্যবহার শেষ, STL সামঞ্জস্যপূর্ণ এপিআই উপসেট ব্যবহার push_back()না append(); front()না first(), ...) এখনো আবার porting কিউটি 5. আসা উভয় Qt2-> 3 এবং Qt3- সালে এড়াতে 4> রূপান্তর, Qt ধারকগুলির মধ্যে পরিবর্তনগুলি সবচেয়ে বেশি কোড মন্থনের প্রয়োজনগুলির মধ্যে ছিল।
  • এসটিএল দ্বি নির্দেশমূলক পাত্রে সমস্তই রয়েছে rbegin()/ rend(), পুনরাবৃত্তি পুনরাবৃত্তির জন্য বিপরীত পুনরাবৃত্তি প্রতিসাম্য তৈরি করে। সমস্ত কিউটি কন্টেইনারগুলিতে সেগুলি থাকে না (সংঘবদ্ধ যারা থাকে না), তাই বিপরীত পুনরাবৃত্তি অকারণে জটিল।
  • এসটিএল পাত্রে insert()বিভিন্ন, তবে সামঞ্জস্যপূর্ণ, পুনরাবৃত্তকারী প্রকারের পরিসীমা রয়েছে, যা std::copy()প্রায়শই প্রয়োজন হয়।
  • STL পাত্রে একটি আছে Allocatorকাস্টম মেমরি ব্যবস্থাপনা উপার্জন টেমপ্লেট যুক্তি, তুচ্ছ (হয় typedef প্রয়োজন), সঙ্গে তুলনা করা Qt (এর কাঁটাচামচ QLineEditজন্য প্রয়োজন বোধ করা s/QString/secqstring/)। সম্পাদনা 20171220 : এটি সি ++ 11 এবং সি ++ 17, সিএফ অনুসরণ করে বরাদ্দকারী নকশায় অগ্রগতির চতুর্থাংশ কেটে দেয় যেমন জন লাকোসের আলাপ ( অংশ ২ )।
  • এর সমান কোন কিউটি নেই std::deque
  • std::listহয়েছে splice()। যখনই আমি নিজেকে ব্যবহার std::listকরতে দেখি, এটি প্রয়োজন কারণ splice()
  • std::stack, std::queueসঠিকভাবে তাদের অন্তর্নিহিত ধারক সমষ্টি, এবং এটি উত্তরাধিকারী না, যেমন QStack, QQueueনা।
  • QSetমত std::unordered_set, মত না std::set
  • QListএকটি ঠিক অদ্ভুত

উপরের অনেকগুলি কিউটিতে সহজেই সমাধান করা যেতে পারে তবে কিউটি তে কনটেইনার লাইব্রেরি এই মুহুর্তে বিকাশের ফোকাসের অভাব অনুভব করছে বলে মনে হয়।

সম্পাদনা 20150106 : Qt 5 ধারক ক্লাসে সি ++ 11-সমর্থন আনার চেষ্টা করার জন্য কিছু সময় ব্যয় করার পরে, আমি সিদ্ধান্ত নিয়েছি যে এটি কাজের পক্ষে উপযুক্ত নয়। আপনি যদি সি ++ স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়নের জন্য যে কাজটি করা হচ্ছে তা যদি আপনি লক্ষ্য করেন তবে এটি সম্পূর্ণ পরিষ্কার যে কিউটি ক্লাসগুলি কখনই গ্রহণ করবে না। আমরা এখন Qt 5.4 প্রকাশ করেছি এবংQVector এখনও পুনঃনির্ধারণের উপাদানগুলিকে সরিয়ে নেই, নেইemplace_back()বা মূল্যায়ন করছি নাpush_back()... ... আমরা সম্প্রতিপরিবর্তেQOptionalঅপেক্ষা করেএকটিশ্রেণিকটেম্পলেটওপ্রত্যাখ্যান করেছিstd::optional। অনুরূপ জন্যstd::unique_ptr। আমি আশা করি যে ধারা অব্যাহত থাকবে।


3
হাহ। আমি ছাপ অধীন QList ছিল সমতুল্য ছিল std::deque। স্পষ্টতই, আমি ডকুমেন্টেশন স্কারম করা উচিত নয়।
ডেনিস জিকফুজ

QVectorছিল crbeginকিউটি 5.6 থেকে এবং বন্ধুদের
বার্ট Louwers

@ অ্যালেক্স: ঠিক আছে, আমি সহজগুলি যুক্ত করেছি, তবে কিউএইচটি কন্টেইনারগুলির মধ্যে এটি নেই, তবে (কারণ আপনি std::reverse_iteratorভাঙ্গা QHash/ QMapপুনরাবৃত্তকারীগুলির উপরে ব্যবহার করেন না , যা যখন বিবেচিত হয়, mapped_typeপরিবর্তে ফিরে আসে value_type)। কিছুই যে নির্ধারণ করা যাবে না, কিন্তু আমার দেখতে সম্পাদনা থেকে 2015.
mmutz - মার্ক Mutz

@ মার্কমুটজ-মিমুতজ স্পষ্ট করার জন্য আপনাকে ধন্যবাদ।
বার্ট লুবার্স

তালিকায় যুক্ত হওয়া উপযুক্ত হতে পারে যে উদাহরণস্বরূপ এটির সূচক হিসাবে QVectorব্যবহার intকরে, এইভাবে 31-বিট আকারকে সীমাবদ্ধ করে (এমনকি 64৪-বিট সিস্টেমেও)। তদতিরিক্ত, এটি এমনকি INT_MAX1 বাইটের চেয়ে বড় আকারের উপাদানগুলি সঞ্চয় করতে পারে না । উদাহরণস্বরূপ, x86_64 লিনাক্সের সর্বাধিক .size()আমি যেটি করতে পারি QVector<float>জিসিসিটি ছিল 536870907 উপাদান (2²⁹-5), যখন std::vector<float>সফলভাবে বরাদ্দ করা হয়েছে 4294967295 উপাদান (2³² -1; এর জন্য র‌্যামের অভাবের কারণে বেশি চেষ্টা করেনি (এই আকারটি ইতিমধ্যে 16 GiB লাগে) )।
রুসলান

31

আসুন এই দাবিকে প্রকৃত পরিমাপযোগ্য ঘটনা হিসাবে ভেঙে দিন:

  • লাইটার: কিউটি কনটেইনারগুলি এসটিএল ধারকগুলির চেয়ে কম মেমরি ব্যবহার করে
  • নিরাপদ: কিউটি পাত্রে অপ্রতুলভাবে ব্যবহার করার সুযোগ কম রয়েছে
  • আরও সহজ: কিউটি পাত্রে কোনও বৌদ্ধিক বোঝা কম পাওয়া যায়

সহজ

এই প্রসঙ্গে দাবি করা হয়েছে যে জাভা-স্টাইলের পুনরাবৃত্তিটি কোনওভাবে এসটিএল স্টাইলের চেয়ে "সহজ", এবং তাই এই অতিরিক্ত ইন্টারফেসের কারণে 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 প্রোগ্রামার উপর। গিরি একটি অনেক কম অনুপ্রবেশজনক সমাধান, তবে উপরে উত্থাপিত কারণে অপ্রয়োজনীয়।

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

উপসংহারে

কোনও অনুলিপি ব্যয় ব্যয় না করে যখনই সম্ভব সম্ভব হয় তখন কিউইটি কনটেইনার ব্যবহার এড়িয়ে চলুন এবং যখনই সম্ভব সম্ভব এসটিএল টাইপ পুনরাবৃত্তি (সম্ভবত কোনও মোড়কের মাধ্যমে বা নতুন সিনট্যাক্সের মাধ্যমে) ব্যবহার করুন।


4
আপনার পয়েন্টগুলি মূলত বৈধ, তবে সেখানে কিছু বিভ্রান্তিকর তথ্য রয়েছে: Adding an unnecessary level of abstraction on top of an already stable and usable interface? Not my idea of "easier".কিউটির জাভা-স্টাইলের পুনরাবৃত্তিগুলি সি ++ 11 এ যুক্ত করা হয়নি; তারা এটি পূর্বাভাস। যাইহোক foreach(QString elem, list)কিউটস সি ++ 11 এর পূর্বাবা বা BOOST_FOREach এর মতোই সহজ এবং এটি প্রাক-সি ++ 11 অনুবর্তী সংকলকগুলির সাথে কাজ করে।
weberc2

@ ওয়েবারসি 2 আপনি বিভ্রান্ত; কিউটির জাভা স্টাইলের পুনরুক্তিগুলি সি ++ (সি ++ 11 নয়) এর উপরে যুক্ত করা হয় ite এটি বিমূর্ততার একটি অতিরিক্ত স্তর (এবং একটি অপ্রয়োজনীয়) যা ইন্টারফেসটি ফুটিয়ে তোলে, যা সহজ নয়। এবং কিউটি-র জন্য ভবিষ্যদ্বাণী BOOST_FOREach হিসাবে সহজ নয়, কারণ এটি উল্লেখযোগ্যভাবে নিরাপদ নয় এবং সমর্থনটির সমান প্রস্থও নেই (BOOST_FOREach C ++ এর যে কোনও সংস্করণের জন্য যে কোনও রেঞ্জের ক্ষেত্রে প্রয়োগ করতে পারে, যেখানে QT তে ভবিষ্যদ্বাণী সি + দাবি করে +03 সম্মতি)। কিউটি-র পূর্বাভাসটি যেকোন মূল্যে এড়ানো উচিত।
অ্যালিস

So, as we can see, this interface gains us nothing except an additional interface, *on top of* an already sleek, streamlined, and modern interface. Adding an unnecessary level of abstraction on top of an already stable and usable interface? Not my idea of "easier".(জোর দেওয়া খনি) আপনি আমাদের ঠিক এই মুহুর্তটি C ++ 11 এবং পূর্বাভাসের BOOST সংস্করণগুলি দেখানোর পরে বলেছিলেন, Qt সংস্করণটি এই দুটির মধ্যে একটির মধ্যে নির্মিত, যা এএএএফসিটি নয়। আমি নিশ্চিত যে আপনি যা বোঝাতে চেয়েছিলেন তা তা নয়, তবে এটিই বন্ধ হয়ে যায়। সুতরাং "বিভ্রান্তিকর তথ্য"।
weberc2

It's an additional layer of abstraction (and an unnecessary one) that bloats the interface, which is not easier.আপনি কী তুলনা করছেন তা এখনও অস্পষ্ট। সি ++ 03 পুনরুক্তি? সি ++ 11 পুনরুক্তি? BOOST_FOREACH? উপরের সবগুলো?
weberc2

1
আমি কেবল বলছি, আপনি যে দ্বিবিবর্তনের পদ্ধতিটি উল্লেখ করছেন তা প্রায়শই আপনি খুব দ্বিধাবিভক্ত হন। আমি বিশ্বাস করি যে আপনি মনে করেন আপনি পরিষ্কার এবং আপনার ভাষাটি যুক্তিসঙ্গত, তবে এটি নির্দিষ্ট করে অস্বীকার করা অদ্ভুত বলে মনে হয়। আমি মনে করি একমত হতে সম্মত হন না।
weberc2

22

এসটিএল পাত্রে:

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

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

2
কিউটি মালিকানাধীন নয়
txwikinger

2
@rpg প্রায় সবগুলিই কিউটিএলের ক্ষেত্রে সত্য নয়; কিউটিএলের কোনও শক্তিশালী পারফরম্যান্স গ্যারান্টি নেই (যেমন তারা অতীতে সহজেই সেগুলি ভেঙেছে), এসটিএল অনুগত নয় (কোনও বিপরীত নয়, এবং এইভাবে প্রচুর উত্সাহ দ্বারা এটি ব্যবহার করা যায় না), মানসম্পন্ন নয় (তারা সংস্করণগুলির মধ্যে নিয়মিত পরিবর্তিত হয়), এবং না জেনেরিক প্রোগ্রামিংকে উত্সাহিত করবেন না (উদাহরণস্বরূপ তাদের বরাদ্দকারীদের জন্য কোনও টেম্পলেট আর্গুমেন্ট নেই)।
অ্যালিস

15

কিউটি কনটেইনারগুলি অনুলিপি করে অনুলিপি ব্যবহার করে।


2
+1, পারফরম্যান্স এবং রিসোর্সে একটি উল্লেখযোগ্য সুবিধা হতে পারে
রেডগ্লাইফ

31
বা একটি উল্লেখযোগ্য অসুবিধা হতে পারে। Getw.ca/publications/optimizations.htm
কাজ ড্রাগন

3
পারমাণবিক পুনঃনিরোধকটি বেশ ভালভাবে ভাড়া বলে মনে হচ্ছে: labs.troltech.com/blogs/2006/10/16/…
rpg

এসটিএল পাত্রে তাদের কর্মক্ষমতা গ্যারান্টি এবং স্পেকটি পূরণ করা যতক্ষণ না আইডিয়ামগুলি বিদ্যমান তা ব্যবহার করতে মুক্ত। সিডব্লিউটি বৈধ, এমনকি সি ++ 11 / সি ++ 14 এসটিএল এর অধীনে।
অ্যালিস

1
@ অ্যালিস COW বেশিরভাগ সময়ই বৈধ বাস্তবায়ন নয় কারণ এটি প্রায় কোনও ক্ষেত্রে স্ট্যান্ডার্ডের জটিলতা এবং পুনরাবৃত্তির বৈধতা গ্যারান্টি ভঙ্গ করে। সিওডাব্লু দিয়ে প্রয়োগ করা যেতে পারে এমন কয়েকটি ক্লাসগুলির মধ্যে একটি হ'ল std::basic_stringএবং মানটি সি -++ এর সাথে এই অ-সঙ্গতিপূর্ণ হওয়ার জন্য পদক্ষেপ নিয়েছিল।
টিয়াগো গোমস

9

মূল সমস্যাগুলির মধ্যে একটি হ'ল কিউটির এপিআই আশা করে যে আপনি কিউটি এর পাত্রে ডেটা সরবরাহ করবেন, সুতরাং আপনি পাশাপাশি দু'জনের মধ্যে পিছনে পরিবর্তনের পরিবর্তে Qt ধারকগুলি ব্যবহার করতে পারেন।

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


1
আপনাকে যে হারে এসটিএল এবং কিউটি কনটেইনারগুলির মধ্যে একটি সত্যিকারের অ্যাপ্লিকেশনটিতে এসটিএল ব্যবহার করে যেখানে "কিউটি" এর সাথে ইন্টারফেসিং করা হয় তা সাধারণত অতিমাত্রায় বিবেচিত হয় না between বেশিরভাগ সময় আপনি উপস্থাপনা স্তরটিতে (যা Qt ব্যবহার করে) আসে / থেকে কিছু std :: রূপান্তর করুন এবং আপনি নিখরচায় ধারক স্যুইচ পাবেন। আগ্রহী পক্ষগুলি নিজেরাই দেখতে প্রজেক্টস.কেডি.আর / প্রকল্পগুলি / কেডি / কেডেপিম / রিপোসিটরি / রিভিশনস / জি ব্রাউজ করতে পারে।
মার্ক মুটজ - মিমুতজ

8

আপনি যে ডেটা দিয়ে কাজ করছেন তা যদি বেশিরভাগ কিউটি ভিত্তিক ইউআই চালাতে ব্যবহৃত হয় তবে অবশ্যই কিউটি পাত্রে ব্যবহার করুন।

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

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


7

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

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

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


9
আপনার প্রথম বিষয়টির সাথে: আমি ধরে নিলাম যে ওপি ইতিমধ্যে Qt ব্যবহার করে এমন প্রকল্পগুলিকে উল্লেখ করছে এবং তাই ইতিমধ্যে "মূলধারার" প্ল্যাটফর্মগুলিতে সীমাবদ্ধ রয়েছে। এমনটি অসম্ভব বলে মনে হচ্ছে যে কেউ কেবল তার ধারক ক্লাসের জন্য Qt এর মতো এমন একটি ভারী ওজনের লাইব্রেরিটি টানবে।
এইসুইটসইস ব্ল্যাকনট

4

আমার পাঁচটি সেন্ট: কিউটি পাত্রে বিভিন্ন প্ল্যাটফর্মগুলিতে একই কাজ করার কথা রয়েছে। এসটিএল ধারকগুলি এসটিএল বাস্তবায়নের উপর নির্ভর করে। আপনি বিভিন্ন পারফরম্যান্স ফলাফল পেতে পারেন।

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


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

1
আপনি যদি STL প্রতিশ্রুতি রক্ষা করেন (এটি কীভাবে বাস্তবায়িত হয় তা ধরে নেওয়ার পরিবর্তে) আপনার কখনই STL এর সাথে প্ল্যাটফর্মগুলির মধ্যে চলতে সমস্যা হবে না। একই সাথে Qt।
মাইকেল কোহনে

এটি সত্যের বিপরীত। সব প্ল্যাটফর্মগুলিতে এসটিএল পাত্রে সর্বদা একই কাজ করে; যদি তারা না করে তবে তারা এসটিএল নয়। কিউটি, তবে, সংস্করণ থেকে সংস্করণে ক্রমশ কর্মক্ষমতা পরিবর্তন করে, সুতরাং কিউটি ৪.৮ এর চেয়ে কিউটি ৪.০ সহ একটি প্ল্যাটফর্মে আপনি কিছু গুরুতর পরিবর্তন পেতে পারেন।
অ্যালিস

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

3

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


3

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


3

কিউভেক্টরটিতে একটি (কখনও কখনও) বড় সীমাবদ্ধতা রয়েছে। এটি কেবল মেমরির ইনট বাইটগুলি বরাদ্দ করতে পারে (নোট করুন যে সীমাটি বাইটে উপাদানগুলির সংখ্যায় নয়)। এর থেকে বোঝা যায় যে কিউভেক্টরের সাথে 2GB ডলারের চেয়ে বড় মেমরির সংকীর্ণ ব্লকগুলি বরাদ্দ করার চেষ্টা করলে ক্রাশ হবে to এটি Qt 4 এবং 5 দিয়ে ঘটে st স্ট্যান্ড :: ভেক্টরের এ জাতীয় সীমাবদ্ধতা নেই।


0

আমার জন্য এসটিএল পাত্রে যাওয়ার মূল কারণটি হ'ল খুব বড় পাত্রে মেমরির পুনঃব্যবহার করতে আপনার যদি কাস্টম বরাদ্দকারী প্রয়োজন হয়। ধরুন উদাহরণস্বরূপ আপনার কাছে এমন কিউম্যাপ রয়েছে যা 1000000 এন্ট্রি (কী / মান জোড়া) সঞ্চয় করে। কিউটি তে ঠিক 1000000 মিলিয়ন বরাদ্দ বোঝায় (new কলগুলি) যাই হোক না কেন তা । এসটিএলে আপনি সর্বদা একটি কাস্টম বরাদ্দকারী তৈরি করতে পারেন যা অভ্যন্তরীণভাবে সমস্ত মেমরি একবারে বরাদ্দ করে এবং মানচিত্রটি জনবহুল হওয়ায় এটি প্রতিটি এন্ট্রিতে বরাদ্দ করে।

আমার পরামর্শটি হ'ল ব্যবসায়ের যুক্তিতে পারফরম্যান্স ক্রিটিক্যাল অ্যালগরিদমগুলি লেখার সময় এসটিএল কনটেইনারগুলি ব্যবহার করা এবং তারপরে ফলাফলগুলি আপনার ইউআই কন্ট্রোলগুলি এবং ফর্মগুলির দ্বারা প্রদর্শিত হয় যদি প্রয়োজন হয় তবে সেগুলি পুনরায় রূপান্তর করুন।


এখানে QTL রক্ষার জন্য চেষ্টা, কিন্তু আপনি পারে বিশেষজ্ঞ QMapNode<K,V>আপনার জন্য K, Vআপনার নিজের প্রদান operator new
মার্ক মুটজ - মিমুতজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.