سؤال

// ((++currentEntry)--) is equivalent to (currentEntry + 1). Kind of.
menuEntries.insert((++currentEntry)--, newEntries.begin(), newEntries.end());

لذلك لدي أسوأ رمز في العالم هنا. هل هناك طريقة أفضل للقيام بذلك؟

عند استخدام "+ 1" أحصل على هذا:

source/menu.cpp:146:37: error: invalid operands to binary expression
      ('list<menuEntry *>::iterator' (aka '_List_iterator<menuEntry *>') and
      'int')
                            menuEntries.insert(currentEntry + 1, ...
                                               ~~~~~~~~~~~~ ^ ~
هل كانت مفيدة؟

المحلول

لماذا لا تنقسم إلى خطوط متعددة:

iterator nextEntry = currentEntry;
menuEntries.insert( ++nextEntry, newEntries.begin(), newEntries.end());

أين iterator هل نوع التكرار للقائمة. شخصيا ، ربما سأسحب ++nextEntry على خطها الخاص لمزيد من الوضوح - ولكن هذا ربما يكون قرارًا شخصيًا.

نصائح أخرى

ماذا عن وظيفة المساعد:

template<class IterT>
IterT Next(IterT i)
{
  return ++i;
}

يمكنك بعد ذلك استبدال (++currentEntry)-- بواسطة Next(currentEntry)

يحرر:أو حتى أفضل: إذا كنت تستخدم Boost ، انظر اقتراح روب التالي والمسبق في مكتبة المرافق

++currentEntry;
menuEntries.insert(currentEntry, newEntries.begin(), newEntries.end());
--currentEntry;

أو

menuEntries.insert(++currentEntry, newEntries.begin(), newEntries.end());
--currentEntry;

يمكنك استخدام المتكررين العكسيين ، على سبيل المثال:

myList.insert(myList.rbegin(), newEntries.begin(), newEntries.end())

سيضيف العناصر الجديدة إلى النهاية.

بالطبع ، ما إذا كان هذا يعمل من أجلك يعتمد على الطريقة التي تستخدم بها Iterator.

نظرًا لأنك لا ترغب في التأثير على تكرارك الحالي ، وتريد إدراج العضو بعد CurrentErtry ، فإن CurrentErtry + 1 هو أفضل رهان.

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