التكرار في C++ (stl) مقابل جافا, هل هناك المفاهيمي الفرق ؟

StackOverflow https://stackoverflow.com/questions/56347

  •  09-06-2019
  •  | 
  •  

سؤال

أنا العودة إلى c++ بعد يجري بعيدا قليلا و يحاول نفض الغبار عن القديم البطيخ.

في جافا التكرار هو واجهة حاوية وجود طرق:hasNext () ، () وإزالة().وجود hasNext() يعني أنه لديه مفهوم الحد حاوية يتم اجتيازه.

//with an Iterator
Iterator<String> iter = trees.iterator();
while (iter.hasNext()) 
{
    System.out.println(iter.next());
}

في C++ القياسية قالب مكتبة التكرار يبدو أن تمثل نوع البيانات أو فئة يدعم المشغل++ و المشغل== ولكن أي مفهوم من حد بنيت في ذلك المقارنة المطلوبة قبل التقدم إلى البند التالي.الحد يجب أن يتم التحقق من قبل المستخدم المقارنة بين اثنين من التكرار في حالة طبيعية الثاني مكرر هو حاوية الغاية.

vector<int> vec;
vector<int>::iterator iter;

// Add some elements to vector
v.push_back(1);
v.push_back(4);
v.push_back(8);

for(iter= v.begin(); iter != v.end(); iter++)
{
    cout << *i << " "; //Should output 1 4 8
}

الجزء المثير للاهتمام هنا هو أن في C++ مؤشر مكرر إلى صفيف.المحكمة أخذت القائمة وبناء الاتفاقية حوله.

هناك المزيد من الدقة إلى هذا أن أنا في عداد المفقودين ؟

هل كانت مفيدة؟

المحلول

نعم هناك مجموعة كبيرة المفاهيمي الفرق.C++ تستخدم مختلف "الطبقات" من التكرار.وتستخدم بعض الوصول العشوائي (على عكس جافا), وتستخدم بعض الأمام الوصول (مثل جافا).في حين أن البعض الآخر حتى تستخدم في كتابة البيانات (للاستخدام مع القول ، transform).

ترى التكرار المفهوم في وثائق C++ :

  • إدخال مكرر
  • إخراج مكرر
  • إلى الأمام مكرر
  • التكرار ثنائي
  • وصول عشوائي مكرر

هذه هي أكثر إثارة للاهتمام بكثير وقوية بالمقارنة مع Java/C#'s سقيم التكرار.نأمل أن هذه الاتفاقيات سوف تكون مقننة باستخدام C++0x هو المفاهيم.

نصائح أخرى

ربما أكثر قليلا النظرية.رياضيا, مجموعات في C++ يمكن وصفها بأنها نصف مفتوحة فترة من التكرار ، أي واحد مكرر لافتا إلى البدء في جمع واحد مكرر الإشارة خلف العنصر الأخير.

هذه الاتفاقية تفتح مجموعة من الاحتمالات.طريقة عمل خوارزميات في C++, كل ما يمكن أن تطبق على subsequences من مجموعة أكبر.لجعل مثل هذا العمل شيء في جافا ، يجب عليك إنشاء التفاف حول القائمة جمع عوائد مختلفة مكرر.

جانب آخر مهم من التكرار سبق ذكره من قبل فرانك.هناك مفاهيم مختلفة من التكرار.جافا التكرار تتوافق مع C++ مدخلات التكرار ، أيفهي للقراءة فقط التكرار يمكن أن يكون إلا بمقدار خطوة واحدة في وقت واحد و لا يمكن العودة إلى الوراء.

على الطرف الآخر, لديك ج المؤشرات التي تتوافق تماما مع C++' مفهوم الوصول العشوائي مكرر.

جميع في كل شيء ، C++ يقدم أكثر ثراء و أنقى مفهوم التي يمكن تطبيقها على مجموعة متنوعة أوسع بكثير من المهام من أي ج مؤشرات أو جافا التكرار.

كما ذكر, Java و C# التكرار تصف اختلط الموقف(الدولة) و مجموعة(القيمة) ، في حين C++ التكرار منفصلة مفاهيم موقف مجموعة.C++ التكرار تمثل 'أين أنا الآن' على حدة من أين يمكن أن أذهب؟'.

Java و C# التكرار لا يمكن نسخها.لا يمكنك استعادة الموقف السابق.المشترك C++ التكرار يمكن.

النظر في هذا المثال:

// for each element in vec
for(iter a = vec.begin(); a != vec.end(); ++a){
  // critical step!  We will revisit 'a' later.
  iter cur = a; 
  unsigned i = 0;
  // print 3 elements
  for(; cur != vec.end() && i < 3; ++cur, ++i){
      cout << *cur << " ";
  }
  cout << "\n";
}

انقر على الرابط أعلاه لمعرفة إخراج البرنامج.

هذا سخيف حلقة يذهب من خلال تسلسل (باستخدام قدما مكرر دلالات فقط) ، الطباعة كل متجاورة subsequence من 3 عناصر بالضبط مرة واحدة (و بعض أقصر subsequences في النهاية).ولكن لنفترض عناصر N ، M العناصر في خط بدلا من 3 ، هذه الخوارزمية لا يزال O(N*M) مكرر الزيادات ، س(1) الفضاء.

جافا أسلوب التكرار عدم القدرة على تخزين الموقف بشكل مستقل.سوف إما

  • تفقد O(1) الفضاء باستخدام (على سبيل المثال) مجموعة من حجم M لتخزين التاريخ كما يمكنك تكرار
  • سوف تحتاج إلى اجتياز قائمة N مرات ، مما يجعل O(N^2+N*M) الوقت
  • أو استخدام الخرسانة من نوع مصفوفة GetAt وظيفة عضو فقدان genericism والقدرة على استخدام قائمة مرتبطة أنواع الحاويات.

منذ فقط إلى الأمام التكرار ميكانيكا استخدمت في هذا المثال, كنت قادرا على مبادلة في قائمة مع أي مشاكل.هذا أمر بالغ الأهمية التأليف عامة الخوارزميات ، مثل البحث ، تأخر التهيئة و التقييم والفرز ، إلخ.

عدم القدرة على الاحتفاظ الدولة يتوافق بشكل وثيق إلى C++ المحكمة إدخال مكرر على عدد قليل جدا من خوارزميات يتم بناؤها.

مؤشر إلى مصفوفة العنصر هو في الواقع مكرر في الصفيف.

كما تقول في جاوة ، التكرار لديه المزيد من المعرفة الأساسية حاوية من في C++.C++ التكرار العامة ، زوج من التكرار يمكن أن تدل على أي مجموعة:هذا يمكن أن يكون الفرعية مجموعة من حاوية مجموعة على حاويات متعددة (انظر http://www.justsoftwaresolutions.co.uk/articles/pair_iterators.pdf أو http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/zip_iterator.html) أو حتى مجموعة من الأرقام (انظر http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/counting_iterator.html)

التكرار الفئات تحديد ما يمكن وما لا يمكن القيام به مع التكرار.

لي الفرق الأساسي هو أن جافا التكرار نقطة بين العناصر ، في حين C++ المحكمة التكرار نقطة في البنود.

C++ التكرار يتم التعميم من المؤشر المفهوم ؛ أنها تجعل تنطبق على مجموعة واسعة من الحالات.وهو ما يعني أنها يمكن أن تستخدم تفعل أشياء مثل تحديد التعسفي نطاقات.

جافا التكرار نسبيا البكم عدادات (وإن لم يكن سيئا للغاية مثل C#'s ؛ على الأقل جافا ListIterator ويمكن استخدامها على التحور جمع).

التكرار فقط أي ما يعادل المؤشرات في تافهة حالة بالتكرار على محتويات الصفيف في تسلسل.مكرر يمكن توريد الكائنات من أي عدد من المصادر الأخرى:من قاعدة بيانات من ملف من الشبكة ، من بعض حسابية أخرى ، الخ.

C++ library (الجزء المعروف سابقا باسم المحكمة الخاصة بلبنان) التكرار مصممة لتكون متوافقة مع المؤشرات.جافا ، دون مؤشر الحساب ، الحرية في أن تكون أكثر مبرمج-ودية.

في C++ كنت في نهاية المطاف الحاجة إلى استخدام زوج من التكرار.في جافا يمكنك استخدام إما مكرر أو مجموعة.التكرار من المفترض أن يكون الغراء بين الخوارزمية بنية البيانات.رمز مكتوب على 1.5+ نادرا ما تحتاج ذكر التكرار ، ما لم يتم تنفيذ خوارزمية معينة أو بنية البيانات (التي تختلف غالبية المبرمجين لا تحتاج إلى القيام به).كما جافا ينطبق على ديناميكية الأشكال فرعية و هي أسهل بكثير في التعامل معها.

هناك الكثير من الإجابات حول الاختلافات, ولكن شعرت الشيء الذي يزعجني أكثر مع جافا التكرار لم يكن وأكد--لا يمكنك قراءة القيمة الحالية عدة مرات.هذا هو مفيد حقا في الكثير من السيناريوهات ، وخاصة عندما يتم دمج التكرار.

في c++, لديك طريقة للمضي قدما مكرر و قراءة القيمة الحالية.القراءة قيمته لا تقدم التكرار ؛ حتى تتمكن من قراءتها عدة مرات.هذا غير ممكن مع جافا التكرار و أنا في نهاية المطاف خلق مغلفة أن تفعل هذا.

ملاحظة جانبية:واحد طريقة سهلة لإنشاء المجمع هو استخدام واحدة موجودة--PeekingIterator من الجوافة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top