可能重复:
在基于范围的for循环内擦除容器中的元素
与此类似,您可以在使用新for( auto item : list )语法迭代STL列表时从STL列表中删除吗?
这是一个完整的例子(崩溃!)
#include <list>
using namespace std ;
int main()
{
list<int> li;
li.push_back( 4 ) ;
li.push_back( 5 ) ;
li.push_back( 6 ) ;
for( auto num : li )
{
if( num == 5 )
li.remove( num ) ;
else
printf( "%d\n", num ) ;
}
}
Run Code Online (Sandbox Code Playgroud) 我试图使用循环和迭代器从双端队列中删除一个元素.我正在关注在线示例,但看到了一个错误.
我正在使用g ++(GCC)4.8.3 20140911(Red Hat 4.8.3-9).
这是代码:
#include <iostream>
#include <deque>
using namespace std;
// Display the contents of a queue
void disp_deque(deque<int>& deque) {
cout << "deque contains: ";
for (auto itr = deque.begin(); itr!=deque.end(); ++itr)
cout << *itr << ' ';
cout << '\n';
}
int main(int argc, char** argv) {
deque<int> mydeque;
// Put 10 integers in the deque.
for (int i=1; i<=10; i++) mydeque.push_back(i);
disp_deque(mydeque);
auto it = mydeque.begin();
while (it!=mydeque.end()) {
cout << …Run Code Online (Sandbox Code Playgroud) 我有对象列表.我从该列表中获取了一些项目并对项目执行了一些操作.如果工作没有错误,我希望从列表中删除这些项目.之后,在擦除时,我得到异常迭代器的异常.我知道tmp是不同的列表.但是如何解决这个问题呢?
#include <list>
class A
{
public:
A(int i):i_(i){}
private:
int i_;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::list<A> list;
A a(1), b(2), c(3);
list.push_back(a);
list.push_back(b);
list.push_back(c);
std::list<A> tmp;
tmp.insert(tmp.end(), list.begin(), list.end());
// do something with tmp
// if all is ok, then erase what is done
list.erase(tmp.begin(), tmp.end());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
tmp.Insert并不总是满满的list.它可以复制部分list,所以我不想要清楚整体list.
我有很多继承自抽象基SysLaserBase的类.我将每个激光添加到程序中的列表(指向对象的指针的矢量),如函数addLaser()中所示.这完全正常,它完全正常工作,我可以遍历我创建的所有激光并使用他们的方法没有问题.
当我想从系统中"移除"激光时,就会出现问题.我通过比较对象的地址和基类指针向量中的所有地址来做到这一点.这合法吗?它导致程序崩溃了一些时间.有什么选择?
请在此处找到方法的代码,然后是导致崩溃的调用示例.你在removeLaser()的代码中发现了什么问题吗?为什么在拆除单个激光后整个系统会变得疯狂?
涉及的向量是在基类的主体中:
std::vector<SysLaserBase<T>*> lasers;
Run Code Online (Sandbox Code Playgroud)
以及添加和删除方法:
template <typename T>
void SysSystemBase<T>::addLaser(const SysLaserBase<T> &src)
{
bool alreadyThere = 0;
for(unsigned long i = 0; i < lasers.size(); i++)
{
if(&src == lasers[i])
{
alreadyThere = 1;
break;
}
}
if(!alreadyThere)
{
lasers.push_back(const_cast<SysLaserBase<T>*>(&src));
}
signalsOut.resize(lasers.size());
}
template <typename T>
void SysSystemBase<T>::removeLaser(const SysLaserBase<T> &src)
{
for(typename std::vector<SysLaserBase<T>*>::iterator it = lasers.begin(); it != lasers.end(); ++it)
{
if((*it) == &src)
{
lasers.erase(it);
}
}
signalsOut.resize(lasers.size());
}
Run Code Online (Sandbox Code Playgroud)
调用此代码:
sys.addLaser(las0);
sys.addLaser(las1);
sys.addLaser(las2);
sys.removeLaser(las0); //removes the laser, …Run Code Online (Sandbox Code Playgroud) 我想在迭代时从列表中删除项目.我以前做过这个,但不知怎的,这个简单的例子让我失望了.thnx提前帮助!
#include<iostream>
#include<list>
using namespace std;
void main()
{
list<int> x;
for ( int i =0;i<10; i++)
x.push_back(i);
for( list<int>::iterator k = x.begin(); k != x.end();k++)
cout<<*k<<" ";
cout<<endl;
for( list<int>::iterator k = x.begin(); k != x.end();k++)
{
if ((*k)%2)
{
x.erase(k);
}
}
cout<<endl;
getchar();
}
Run Code Online (Sandbox Code Playgroud) 我打算写这样的代码:
std::list<whatevertype> mylist;
// ...
std::list<whatevertype>::iterator it;
for(it = mylist.begin(); it != mylist.end(); ++it) {
// ...
if(some condition)
mylist.erase(it);
}
Run Code Online (Sandbox Code Playgroud)
但我意识到,这段代码是错误的:mylist.erase(x)将使迭代器无效it,因此++it可能会失败.
所以我尝试将其更改为
std::list<whatevertype>::iterator it;
std::list<whatevertype>::iterator nextit;
for(it = mylist.begin(); it != mylist.end(); it = nextit) {
// ...
nextit = it + 1;
if(some condition)
mylist.erase(it);
}
Run Code Online (Sandbox Code Playgroud)
但是,令我惊讶的是,这失败了:显然operator+没有为std::list迭代器定义.
我已经发现了另一个问题并且了解到删除"从下面"迭代器的标准习惯用法更像是
for(it = mylist.begin(); it != mylist.end(); ) {
if(some condition)
it = mylist.erase(it);
else ++it;
}
Run Code Online (Sandbox Code Playgroud)
我相信我也可以逃脱
for(it …Run Code Online (Sandbox Code Playgroud) 我有以下功能.
void BulletFactory::update(Uint32 ticks) {
std::list<Sprite*>::iterator it = activeBullets.begin();
while (it != activeBullets.end()) {
(*it)->update(ticks);
if(!((*it)->inView())) {
activeBullets.remove(*it);
Sprite* temp = *it;
it++;
inactiveBullets.push_back(temp);
} else {
it++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当条件!((*it)->inView())正在true有段故障.我无法看到问题.
编辑:忘了提到activeBullets和inactiveBullets是两个列表.
有没有办法删除循环遍历该列表的 for 循环中的列表项?例子:
std::list<int> myList;
myList.push_back(5);
myList.push_back(8);
std::list<int>::iterator i;
for (i = myList.begin(); i != myList.end(); i++)
{
if (i == 8)
// myList.remove(*i);
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以myList.remove(*i)用其他东西替换,因为那会产生错误。