【问题标题】:How to use std::lower_bound to compare object variables without second object to compare with如何使用 std::lower_bound 在没有第二个对象的情况下比较对象变量
【发布时间】:2020-02-29 02:03:58
【问题描述】:

我想将我的“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' 

【问题讨论】:

  • “如何使用 std::lower_bound 在没有第二个对象的情况下比较对象变量” - 你不能。不可能。寻找不同的方式。
  • 您可能需要重新阅读有关 std::lower_bound() 的文档。听起来它与您尝试做的事情无关。到底你到底想完成什么?
  • 我正在尝试将 WorldChunk x 和 y 与传入的函数进行比较,它是已排序的向量,因此我想使用 std::lower_bound 以获得更好的性能。
  • @Zmiennocieplny:它是按照 X 和 Y 排序的吗?按那个顺序?

标签: c++ sorting lambda std predicate


【解决方案1】:

您遇到的问题是您试图通过 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 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多