Не добавляется структура в <set>

293
05 ноября 2017, 18:28

Не добавляется структура во множество. Не могу разобраться в ошибках в функции 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);
    }
}

Ошибки компилятора:

Ошибки компилятора

Answer 1

В C++ set требует возможности сравнивать элементы (по умолчанию используя оператор <).

Скажите, как вообще сравнить Clr{1,3,5} и Clr{5,3,1} - что из них больше?

А если вы скажете, как - то вы пояснили это компилятору?

Нужно определить компаратор для этого типа значений и передать его объекту set при создании.

Answer 2

Множество требует, чтобы у содержащегося в нем типа был оператор <:

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;
    }
};
READ ALSO
Не могу взять значение по итератору

Не могу взять значение по итератору

Как взятьsecond значение пары, на которую указывает

283
Реализация индексации в хэш-таблице на основе хэш-значений полученных с помощью md5 алгоритма

Реализация индексации в хэш-таблице на основе хэш-значений полученных с помощью md5 алгоритма

Используйте степень двойки для размера своей хэш-таблицы и берите младшие биты MD5 для индексации

213