如何确定STL-Container中的最后一个有效元素

时间:2009-05-11 12:53:24

标签: c++ stl

如果我遍历STL容器,我有时需要知道当前项是否是序列中的最后一项。有更好的方法,然后做这样的事情?我可以以某种方式转换rbegin()?

std::vector<int> myList;

// ....
std::vector<int>::iterator lastit = myList.end();  
lastit--;

for(std::vector<int>::iterator it = myList.begin(); it != myList.end(); it++)  {
     if(it == lastit)
     {
        // Do something with last element
     }
     else
     {
       //  Do something with all other elements
     }

8 个答案:

答案 0 :(得分:3)

尝试以下

std::vector<int>::iterator it2 = (++it);
if ( it2 == myList.end() ) {
  ...
}

以下内容也适用

if ( it+1 == myList.end() ) {
  // it is last
  ...
}

答案 1 :(得分:2)

也许你可以向后迭代(使用rbegin / rend)并将你的特殊任务放在循环之前或用it != lastit替换结束检查并在循环之后进行特殊处理< / p>

答案 2 :(得分:1)

如果需要对某些元素进行不同的处理,我会对我的设计有所怀疑,但这个建议对我来说有点清洁(不要忘记测试空容器)

std::vector<int>::iterator lastit = myList.end();
if (lastit != myList.begin())
{
  lastit--;
  for(std::vector<int>::iterator it = myList.begin(); it != lastit; ++it)
  {
     // Do
  }
  // Do with last
}

答案 3 :(得分:1)

使用反向迭代,这样你只有一个 end() - 1 式计算(注意rbegin()+ 1)和 no comparsions

for(vector<int>::iterator it = myValues.rbegin()+1; it != myValues.rend(); it++) {
    cout << *it << endl;
}
cout << "Process last one: " << *myValues.rbegin() << endl;

另外,对于向量&lt;&gt;,计算end() - 1可能很快,所以你也可以这样做:

for(vector<int>::iterator it = myValues.begin(); it != myValues.end()-1; it++) {
    cout << *it << endl;
}
cout << "Process last one: " << *myValues.rbegin() << endl;

如果您不想在循环后处理元素,您可以:

for(vector<int>::iterator it = myValues.rbegin(); it != myValues.rend(); it++) {
    if(it == myValues.rbegin())
        cout << "Process last one: " << *it << endl;
    else
        cout << *it << endl;
}

答案 4 :(得分:0)

对于像vector这样的随机访问迭代器,你不需要临时文件。你可以说:

if ( it + 1 == v.end() ) {
   // at one before end
}

编辑:即使对于非随机访问类型,也可以使用std :; distance:

if ( distance( it, v.end() ) == 1 ) {
   // at one before end
}

答案 5 :(得分:0)

一个重要的问题是:如果你为1个元素做一些特别的事情,为什么要创建一个循环。为什么不对第3个元素做一些特别的事情?到每4个小时? ...

只需迭代要处理的元素,编写单独的代码来处理其他元素。

也要查看this question的答案。

答案 6 :(得分:0)

为什么不:

if(!myList.empty())
    last_it = myList.begin() + myList.size()-1;
else
    last_it = myList.end();


//or
    last_it = myList.empty() ? myList.end() : myList.begin() + myList.size() - 1;

答案 7 :(得分:-1)

如果您正在使用向量,使用整数索引进行迭代实际上要简单得多:

std::vector<int> myList;
for (unsigned int i = 0; i < myList.size(); i++)
{
  if (i == (myList.size() - 1))
  {
    processDifferently (myList[i])
  }
  else
  {
    process (myList[i])
  }
}

最小化对myList.size()的调用次数留作OP的练习:)