相关疑难解决方法(0)

使用C++ 11迭代语法时从STL列表中删除

可能重复:
在基于范围的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)

c++ for-loop c++11

4
推荐指数
1
解决办法
935
查看次数

std :: deque的错误?

我试图使用循环和迭代器从双端队列中删除一个元素.我正在关注在线示例,但看到了一个错误.

我正在使用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)

c++ iterator deque c++11

3
推荐指数
2
解决办法
942
查看次数

std :: list erase不兼容的迭代器

我有对象列表.我从该列表中获取了一些项目并对项目执行了一些操作.如果工作没有错误,我希望从列表中删除这些项目.之后,在擦除时,我得到异常迭代器的异常.我知道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.

c++ stl

2
推荐指数
1
解决办法
1155
查看次数

C++ - 高级多态:这个函数从列表中删除指针是否合法?

我有很多继承自抽象基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)

c++ polymorphism inheritance pointers class

2
推荐指数
1
解决办法
432
查看次数

STL列表擦除项目

可能重复:
你可以在迭代它时从std :: list中删除元素吗?

我想在迭代时从列表中删除项目.我以前做过这个,但不知怎的,这个简单的例子让我失望了.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)

c++ stl

1
推荐指数
2
解决办法
1375
查看次数

为什么没有operator + for std :: list iterators?

我打算写这样的代码:

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)

c++ iterator erase

1
推荐指数
1
解决办法
172
查看次数

遇到c ++ stl列表问题

我有以下功能.

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是两个列表.

c++ stl list

0
推荐指数
1
解决办法
61
查看次数

如何从 C++ 中的 for 循环内的列表中删除

有没有办法删除循环遍历该列表的 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)用其他东西替换,因为那会产生错误。

c++ list

0
推荐指数
1
解决办法
87
查看次数

标签 统计

c++ ×8

stl ×3

c++11 ×2

iterator ×2

list ×2

class ×1

deque ×1

erase ×1

for-loop ×1

inheritance ×1

pointers ×1

polymorphism ×1