Не добавляется структура во множество. Не могу разобраться в ошибках в функции void initColor(), компилятор указывает на инструкцию isColrs.insert(colr). Ссылку на файл с ошибками компилятора добавил ниже.
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <vector>
#include <cmath>
#include <iostream>
#include <string>
#include <set>
#include <random>
#include <ctime>
using namespace std;
using namespace sf;
const string WINDOW_TITLE = "Dispaying Balls";
constexpr unsigned WINDOW_WIDTH = 800;
constexpr unsigned WINDOW_HEIGHT = 600;
struct Colr
{
int red;
int green;
int blue;
};
struct Ball
{
CircleShape shape;
Vector2f offset;
};
struct PRNG
{
std::mt19937 engine;
};
void initGenerator(PRNG& generator)
{
// Используем время с 1 января 1970 года в секундах как случайное зерно
const unsigned seed = unsigned(std::time(nullptr));
generator.engine.seed(seed);
}
// Генерирует индекс в диапазоне [0, size)
size_t random_index(PRNG& generator, int size)
{
// Создаём распределение
std::uniform_int_distribution<int> distribution(0, size - 1);
// Вычисляем псевдослучайное число: вызовем распределение как функцию,
// передав генератор произвольных целых чисел как аргумент.
return distribution(generator.engine);
}
void pollEvents(RenderWindow& window)
{
Event event{};
while (window.pollEvent(event))
{
switch (event.type)
{
case Event::Closed:
window.close();
break;
default:
break;
}
}
}
void redrawFrame(RenderWindow& window, Ball& ball)
{
window.clear();
window.draw(ball.shape);
window.display();
}
void initColor(PRNG generator, Colr& colr, set<Colr>& isColrs)
{
colr.red = random_index(generator, 256);
colr.green = random_index(generator, 256);
colr.blue = random_index(generator, 256);
if(!isColrs.empty())
{
//if(isColrs.find(colr) != isColrs.end())
//{
// isColrs.insert(colr);
//}
//else
//{
// initColor(generator, isColrs);
//}
}
else
{
isColrs.insert(colr);
}
}
void initBall(PRNG generator, Colr colr, Ball& ball)
{
ball.shape.setRadius(40);
ball.shape.setPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2);
ball.shape.setOrigin(ball.shape.getRadius(), ball.shape.getRadius());
ball.shape.setFillColor(sf::Color(colr.red, colr.green, colr.blue));
}
void init(PRNG& generator, Colr& colr, set<Colr>& isColrs, Ball& ball)
{
initGenerator(generator);
initColor(generator, colr, isColrs);
initBall(generator, colr, ball);
}
int main()
{
ContextSettings settings;
RenderWindow window(VideoMode({WINDOW_WIDTH, WINDOW_HEIGHT}), WINDOW_TITLE, Style::Default, settings);
PRNG generator;
Ball ball;
Colr colr;
set<Colr> isColrs;
init(generator, colr, isColrs, ball);
while (window.isOpen())
{
pollEvents(window);
redrawFrame(window, ball);
}
}
Ошибки компилятора:
Ошибки компилятора
В C++ set
требует возможности сравнивать элементы (по умолчанию используя оператор <
).
Скажите, как вообще сравнить Clr{1,3,5}
и Clr{5,3,1}
- что из них больше?
А если вы скажете, как - то вы пояснили это компилятору?
Нужно определить компаратор для этого типа значений и передать его объекту set
при создании.
Множество требует, чтобы у содержащегося в нем типа был оператор <:
struct Colr
{
int red;
int green;
int blue;
bool operator<(const Colr& r) const
{
// Пример, возможно, вам нужна другая логика сравнения.
if(red != r.red)
return red < r.red;
if(green != r.green)
return green < r.green;
return blue < r.blue;
}
};
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Используйте степень двойки для размера своей хэш-таблицы и берите младшие биты MD5 для индексации