سؤال
// ((++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 هو أفضل رهان.