如果我遍历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
}
答案 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的练习:)