如何检测迭代容器的第一个或最后一个元素?

时间:2010-04-14 11:19:32

标签: c++ stl

如何以更时尚/更短的方式做到以下几点?

for(i=container.begin(); i!=container.end(); ++i) {
    if (i!=container.begin()) {
        cout << ", ";
    }
    cout << *i;
    j=i;
    if (++j==container.end()) {
        cout << "!" << endl; 
    }
}

foreach之类的解决方案是可以接受的(首先是最后元素上的操作,但是)。

P.S。 有许多答案正在处理第一个元素,但不是最后一个。这就是处理最后一个元素的意思:

for(i=container.begin(); i!=container.end(); ++i) {
    j=i;
    if (i==container.begin()) {
        cout << "[" << *i << "]" << endl;
    } else if (++j==container.end()) {
        cout << ", (" << *i << ")" << "!" << endl; 
    } else {
         cout << ", " << *i;
    }
}

难道您不认为在循环体外处理第一个元素非常容易吗?真正的问题是最后一个问题!我很抱歉无法澄清提出这个问题的重点。我想我最终会接受排名靠前的答案。

7 个答案:

答案 0 :(得分:3)

我的建议是:在此循环中检测任何内容都没有意义!

由于您的特殊情况位于容器的开头和结尾,因此很容易从循环中删除它们的处理。

以下函数将打印任何容器类的内容,其元素可以<<添加到std::ostream

template < class Container >
void print(Container const & container)
{
    typename Container::const_iterator current = container.begin();
    typename Container::const_iterator const end = container.end();
    if (current != end)
    {
        std::cout << *current;
        for (++current; current != end; ++current)
        { 
            std::cout << ", " << *current;
        }
        std::cout << "!" << std::endl;
    }
}

答案 1 :(得分:3)

Boost有next / prior,在这种情况下有时会有所帮助。

for(i=container.begin(); i!=container.end(); ++i) {
    if (boost::next(i) == container.end()) {
         std::cout << "!" << std::endl;
    }
}

虽然对于这种特殊情况,我只是输出第一个元素,从第二个到最后一个循环,同时总是输出','然后输出'!'循环结束后。 (正如其他人已经建议的那样)

我没有看到在循环中移动特殊情况,然后在循环中检查它们的重点.......

答案 2 :(得分:2)

在您的代码中,

if (i==container.end()) {
    cout << "!" << endl; 
}

永远不会发生。

我自己的方法是使用容器大小(我认为size()现在是所有标准库容器的常量时间)。保持循环中的计数,当count == size() - 1时,你就在结束时,并且当count == 0时,显然是。

答案 3 :(得分:2)

由于container未定义,我使用了最简单的vector

template <class T>
string vector_join( const vector<T>& v, const string& token ){
  ostringstream result;
  for (typename vector<T>::const_iterator i = v.begin(); i != v.end(); i++){
    if (i != v.begin()) result << token;
    result << *i;
  }
  return result.str();
}

//usage
cout << vector_join( container, ", " ) << "!";

答案 4 :(得分:1)

稍稍移动++i

i = container.begin();
while(i != container.end()) {
    if (i != container.begin()) {
        cout << ", ";
    }
    cout << *i;
    if (++i == container.end()) {
        cout << "!" << endl; 
    }
}

答案 5 :(得分:1)

template < class TContainerType>
void print(TContainerType const & i_container)
  {
  typename TContainerTypeconst ::const_iterator current = i_container.begin();
  typename TContainerTypeconst ::const_iterator const end = i_container.end();
  if(current != end)
    {
    std::cout << *current++;
    while(current != end)
      std::cout << ", " << *current++;
     }
  std::cout << "!" << std::endl;
  }

答案 6 :(得分:1)

将第二部分带出循环。

for(i=container.begin(); i!=container.end(); ++i) {
    if (i != container.begin()) {
        cout << ", ";
    }
    cout << *i;
}
cout << "!" << endl;