C++ BOOST_FOREACH循环中的访问迭代器

C++ BOOST_FOREACH循环中的访问迭代器,c++,boost,iterator,foreach,C++,Boost,Iterator,Foreach,我有一个BOOST\u FOREACH循环来迭代列表。不幸的是,我还需要将迭代器缓存到特定项 typedef List::iterator savedIterator; BOOST_FOREACH(Item &item, list) { // stuff... if (condition) savedIterator = &item; // this won't work // do more stuff... } 显然,我可以使用循环的list.be

我有一个BOOST\u FOREACH循环来迭代列表。不幸的是,我还需要将迭代器缓存到特定项

typedef List::iterator savedIterator;

BOOST_FOREACH(Item &item, list)
{
// stuff...
  if (condition)
    savedIterator = &item; // this won't work

// do more stuff...     
}

显然,我可以使用循环的list.begin()…list.end()来实现这一点,但我已经开始喜欢BOOST_FOREACH了。有办法解决这个问题吗?

这是不可能的,因为您无法访问指向循环中当前项的迭代器

您可以使用当前的items数据从列表中获取迭代器,但我不知道这是否是一个好主意


我建议您使用列表中已经提出的解决方案。begin()。。list.end(),在我看来,这是最容易实现和识别的。

对于Boost.Foreach,您几乎被对取消引用的迭代器的引用所困扰,因为这就是Boost.Foreach的设计目的:简化对范围内元素的访问。但是,如果您只是在寻找符合条件的单个元素,则可能需要尝试
std::find_if()


我有点奇怪为什么人们不这么做:

#define foreach(iter_type, iter, collection) \
 for (iter_type iter = collection.begin(); iter != collection.end(); ++iter)

但它只是提醒了我,我有时讨厌C++。如果<代码>集合>代码>是一个带有副作用的表达式呢?宏将对其求值两次。另外,传统的
foreach
的全部要点是直接获取值,而根本不需要弄乱迭代器(以及它们冗长而笨拙的类型名)。如果集合是一个表达式,这一点很好。在这种情况下,对表达式求值,然后将其作为引用传递给foreach。集合类型&c=foreach(iter类型,it,c)。。。访问迭代器的好处是灵活性(例如,本文的问题)。我不认为这是一个很大的代价。但也许这只是我的风格…
BOOST\u FOREACH
并不像你想象的那么简单。请阅读这些文章,例如,
collection
是没有迭代器的数组吗?(BOOST_FOREACH的作者撰写了这篇文章)
struct transformation {
  typedef int result_type;
  template <class T>
  int operator()(T const & element) const {
    // stuff
    int result = 1;
    if (condition) result = 0;
    // more stuff
    return result;
  }
};

// somewhere else
List::iterator savedIterator =
  std::min_element(
     boost::make_transform_iterator(list.begin(), transformation()),
     boost::make_transform_iterator(list.end(), transformation()),
  ).base();
#define foreach(iter_type, iter, collection) \
 for (iter_type iter = collection.begin(); iter != collection.end(); ++iter)