如何使用std :: lower_bound比较没有第二个对象要比较的对象变量

问题描述 投票:0回答:1

我想将我的“ 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' 
c++ sorting lambda std predicate
1个回答
0
投票

您遇到的问题是,您试图通过lambda捕获而不是通过参数传递比较值。只要正确地做;不需要第三个参数的类型与迭代器的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 chunk_loc loc)                                     
        {
            return (ch.getX() < loc.x && ch.getY() < loc.y) ? true : false;
        });;

//rest of the function

}

您真正的问题是lower_bound不是通用搜索功能(即std::find)。它要求相对于搜索功能对loaded_chunk序列进行排序(或至少根据测试值进行划分)。也就是说,所有与该值的比较将为真的元素必须位于所有与该值的比较将为假的元素之前。因此,除非您按X / Y位置对块列表进行排序,否则将无法使用。

© www.soinside.com 2019 - 2024. All rights reserved.