如何从std :: list中删除元素?

时间:2018-01-20 08:46:30

标签: c++ list c++11 compiler-errors std

有一个列表ob对象和std :: for_each调用每个对象,但是当完成清除内存任务并在经过时间调用多个对象时需要删除每个对象,需要删除并添加项目dinamicaly:

班级定义:

#include "CoreLog.h"
#include "physical_objects/Rectangle.h"
#include "GL/freeglut.h"
#include "GL/gl.h"
#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
// #include <random>
using namespace std;

class Core
{
    private:
        CoreLog coreLog;
        std::list<Rectangle> rectangles;

    public:
        void init();
        void draw();
};

初始功能是:

void Core::init()
{
    for(float i; i <= 2.0; i += 0.1)
    {
        Rectangle rectangle;
        rectangle.setLeft(-1.0 + i);
        rectangle.setTopToBottomInSeconds(1.0 + i);
        this->rectangles.push_back(rectangle);
    }
}

在循环中需要删除每个项目:

void Core::draw()
{
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable( GL_BLEND );

    glClearColor(0.4, 0.4, 0.4, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    for (Rectangle &rectangle : this->rectangles)
    {
        // Draw object
        rectangle.draw();

        if(!rectangle.getIsVisible())
        {
            this->rectangles.erase(std::find(this->rectangles.begin(), this->rectangles.end(), rectangle));
        }
    }
    // TODO: Add new rectangles here if is necessary.
}

但编译器显示错误:

  

core / Core.cc:44:101:从这里需要   /usr/include/c++/5/bits/predefined_ops.h:194:17:错误:不匹配   'operator =='(操作数类型是'Rectangle'和'const Rectangle')

我尝试更改为const矩形:

const Rectangle r;
r = rectangle;
this->rectangles.erase(std::find(this->rectangles.begin(), this->rectangles.end(), r));

但同样的问题。并尝试添加运算符:

bool operator == (const Rectangle &a, const Rectangle &b);
this->rectangles.erase(std::find(this->rectangles.begin(), this->rectangles.end(), rectangle));

但同样的问题:

  

core / Core.cc:44:93:从这里需要   /usr/include/c++/5/bits/predefined_ops.h:194:17:错误:不匹配   'operator =='(操作数类型是'Rectangle'和'const Rectangle'){   return * __ it == _M_value; }

编译我使用:

CCFLAGS += -lglut -lGL -Wall -Wextra -std=gnu++11

main:
    g++ \
    core/CoreLog.cc \
    core/physical_objects/Rectangle.cc \
    core/Core.cc \
    main.cc \
    $(CCFLAGS) \
    -o compiled/main

    chmod +x compiled/main

1 个答案:

答案 0 :(得分:2)

您需要定义Rectangle ==运算符。

功能是:

//Put this function outside the Rectangle class and implement it
bool operator ==(const Rectangle &a, const Rectangle &b)
{
      //here you need to implement the == operator
}

此外,您的代码将崩溃,因为您擦除了for_each循环中的元素。这使迭代器无效。你需要更加小心。

你可以使用擦除

std::list<Rectangle*>::iterator rect = rectangles.begin();
while (rect != rectangles.end())
{
    if (!rect->getIsVisible())
    {
        rect = rectangles.erase(rect);
    }
    else
    {
        ++rect;
    }
}

您也可以使用STL并在一行中解决它

rectangles.remove_if([](Rectangle const& rect){!(rect.getIsVisible());});