gpt4 book ai didi

c++ - 如何从 std::list 中删除一个元素?

转载 作者:行者123 更新时间:2023-11-28 01:38:26 25 4
gpt4 key购买 nike

有一个 ob 对象列表并放入 std::for_each 调用每个对象,但在完成任务时需要删除每个对象以清除内存并在耗时内调用多个对象,需要动态删除和添加项目:

定义的类:

#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: required from here /usr/include/c++/5/bits/predefined_ops.h:194:17: error: no match for ‘operator==’ (operand types are ‘Rectangle’ and ‘const Rectangle’)

我尝试更改为常量矩形:

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: required from here /usr/include/c++/5/bits/predefined_ops.h:194:17: error: no match for ‘operator==’ (operand types are ‘Rectangle’ and ‘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

最佳答案

您需要定义 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());});

关于c++ - 如何从 std::list 中删除一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48354179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com