C++ 列表迭代器+;操作人员

C++ 列表迭代器+;操作人员,c++,stdlist,C++,Stdlist,我这里有世界上最糟糕的代码。有更好的方法吗 当使用“+1”时,我得到以下结果: // ((++currentEntry)--) is equivalent to (currentEntry + 1). Kind of. menuEntries.insert((++currentEntry)--, newEntries.begin(), newEntries.end()); source/menu.cpp:146:37:错误:二进制表达式的操作数无效 ('list::iterator'(又名'u

我这里有世界上最糟糕的代码。有更好的方法吗

当使用“+1”时,我得到以下结果:

// ((++currentEntry)--) is equivalent to (currentEntry + 1). Kind of.
menuEntries.insert((++currentEntry)--, newEntries.begin(), newEntries.end());
source/menu.cpp:146:37:错误:二进制表达式的操作数无效
('list::iterator'(又名'u list_iterator')和
‘int’)
菜单项。插入(currentEntry+1。。。
~~~~~~~~~~~~ ^ ~


为什么不分成多行:

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

其中,
iterator
是列表的迭代器类型。就我个人而言,我可能会将
++nextEntry
拉到它自己的行中以进一步清晰-但这可能是一个主观决定。

您可以使用反向迭代器,例如:

iterator nextEntry = currentEntry;
menuEntries.insert( ++nextEntry, newEntries.begin(), newEntries.end());
将新项目添加到末尾


当然,这是否适用于您取决于您如何使用迭代器。

由于您不想影响currentEntry迭代器,并且希望在currentEntry之后插入成员,因此currentEntry+1是最佳选择。

辅助函数如何:

myList.insert(myList.rbegin(), newEntries.begin(), newEntries.end())
模板
IterT Next(IterT i)
{
return++i;
}
然后您可以将
(++currentEntry)-
替换为
下一个(currentEntry)

编辑:
或者更好:如果你使用Boost,请参见Rob的建议,你说的“种类”是什么意思?为什么你不能用(currentEntry+1)来代替呢?你确实有最糟糕的代码使用(currentEntry+1),除非运算符++和运算符--有副作用。还有,Menunteries到底是什么?@Gendolkari std::list迭代器不是随机访问的,你不能添加,你只能递增(顺便说一句,我认为想做这样的事情并不少见:)@Kiril:list的迭代器也不是随机访问运算符。+1我也是(:如果出于某种原因,您不希望
nextEntry
在此
insert
之后存在,您可以将这两行放入内部作用域。我现在有了。“std::list::iterator nextEntry=(++currentEntry)--;”这很好。谢谢。@Jookia:在这段代码中,它并不比你原来的代码好。那
++x--
仍然存在……是的,我的代码没有inc/dec-这很混乱。只增加一个,谢谢!@Jookia:如果我读对了,那么做
std::list::iterator nextEntry=(++currentEntry)-;
将(在下一行)为与
currentEntry
相同的元素保留一个迭代器。创建另一个迭代器的全部原因是更改该迭代器并保持原始迭代器不变,这使得inc/dec组合不必要。感谢您的帮助,但它是用于std::list的。确切地说,Boost提供了。它们的工作方式类似于
std::advance
,但它们返回一个new值,而不是修改输入值。@Rob:非常感谢您的评论,如果您不介意的话,我会将其添加到我的答案中。我模糊地记得在Boost中看到了一些东西,但找不到它(我在迭代器库中查找)
iterator nextEntry = currentEntry;
menuEntries.insert( ++nextEntry, newEntries.begin(), newEntries.end());
myList.insert(myList.rbegin(), newEntries.begin(), newEntries.end())
template<class IterT>
IterT Next(IterT i)
{
  return ++i;
}