hid*_*yat 66 c++ iterator vector
我有这个代码:
int main()
{
vector<int> res;
res.push_back(1);
vector<int>::iterator it = res.begin();
for( ; it != res.end(); it++)
{
it = res.erase(it);
//if(it == res.end())
// return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
"一个随机访问迭代器,指向函数调用擦除的最后一个元素之后的元素的新位置,如果操作擦除了序列中的最后一个元素,则为向量结束."
此代码崩溃,但如果我使用if(it == res.end())然后返回它的工作原理.怎么会?for循环是否兑现了res.end(),因此不相等的运算符失败了?
Pie*_*ter 142
res.erase(it)
如果擦除它指向的最后一个元素,则总是返回下一个有效的迭代器 .end()
在循环结束时++it
总是被调用,所以你增加.end()
不允许的.
简单地检查.end()
仍然会留下一个错误,因为你总是在每次迭代时跳过一个元素(通过循环it
返回'递增' .erase()
,然后再循环)
你可能想要这样的东西:
while (it != res.end()) {
it = res.erase(it);
}
Run Code Online (Sandbox Code Playgroud)
擦除每个元素
(为了完整性:我假设这是一个简化的例子,如果你只是希望每个元素都不用去执行操作(例如删除),你应该简单地调用res.clear()
)
当你只是有条件地擦除元素时,你可能想要类似的东西
for ( ; it != res.end(); ) {
if (condition) {
it = res.erase(it);
} else {
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 28
for( ; it != res.end();)
{
it = res.erase(it);
}
Run Code Online (Sandbox Code Playgroud)
或者,更一般的:
for( ; it != res.end();)
{
if (smth)
it = res.erase(it);
else
++it;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
117072 次 |
最近记录: |