Как использовать std :: lower_bound для сравнения переменных объекта без второго объекта для сравнения с - PullRequest
1 голос
/ 03 ноября 2019

Я хочу сравнить мои функции класса "WorldChunk" "getX ()" и "getY ()" с "chunk_x" и "chunk_y", переданными в функцию, но я не хочу создавать новый экземпляр "WorldChunk"для сравнения.

Я пробовал что-то подобное, но это не работает.

int ChunkGrid::unload_chunk(unsigned int chunk_x, unsigned int chunk_y)
{
    auto chunk = std::lower_bound(loaded_chunks.begin(), loaded_chunks.end(), NULL, 
        [chunk_x, chunk_y](const WorldChunk& ch, const auto * null)                                     
        {
            return (ch.getX() == chunk_x && ch.getY() == chunk_y) ? true : false;
        });;

//rest of the function

}

Журнал ошибок:

Error   C2672   'operator __surrogate_func': no matching overloaded function found.

Error   C2784   'auto ChunkGrid::unload_chunk::<lambda_d0b216222e2c66d42cf1e3316f6d68ac>::operator ()(const WorldChunk &,const _T1 *) const': could not deduce template argument for 'const _T1 *' from 'const _Ty' 

1 Ответ

1 голос
/ 03 ноября 2019

Проблема в том, что вы пытаетесь передать значение сравнения через лямбда-захват, а не через параметры. Просто сделай это правильно;не требуется, чтобы тип третьего параметра соответствовал типу итераторов value_type:

int ChunkGrid::unload_chunk(vec2<unsigned int> chunk_loc)
{
    auto chunk = std::lower_bound(loaded_chunks.begin(), loaded_chunks.end(), chunk_loc, 
        [](const WorldChunk& ch, const vec2<unsigned int> &loc)                                     
        {
            return (ch.getX() < loc.x && ch.getY() < loc.y) ? true : false;
        });;

//rest of the function

}

Ваша настоящая проблема в том, что lower_bound не является общей функцией поиска (этоstd::find). Требуется, чтобы последовательность loaded_chunk была отсортирована (или, по крайней мере, разбита на тестовое значение) относительно функции поиска. То есть все элементы, для которых сравнение со значением будет истинным, должны предшествовать всем элементам, для которых сравнение со значением будет ложным. Поэтому, если вы не отсортировали этот список чанков по позиции X / Y (с точным порядком; X

...