标签: bsearch

C++ 11和C++ 14中`bsearch`的规范是否有缺陷?

继我对这个问题的回答之后,在C++ 11和C++ 14中:

[C++11, C++14: 25.5/2]:内容与标准C库头相同<stdlib.h>,但以下情况除外:

[C++11, C++14: 25.5/3]: 功能签名:

bsearch(const void *, const void *, size_t, size_t,
        int (*)(const void *, const void *));
Run Code Online (Sandbox Code Playgroud)

被两个声明取代:

extern "C" void *bsearch(const void *key, const void *base,
                         size_t nmemb, size_t size,
                         int (*compar)(const void *, const void *));

extern "C++" void *bsearch(const void *key, const void *base,
                           size_t nmemb, size_t size,
                           int (*compar)(const void *, const void *));
Run Code Online (Sandbox Code Playgroud)

两者都具有与原始声明相同的行为.

然而,

[C++11, C++14: 7.5/5]:如果两个声明声明具有相同名称的函数,并且参数类型列表(8.3.5)是同一命名空间的成员,或者声明具有相同名称的对象是同一命名空间的成员,并且声明为这些名称提供不同的语言链接,该计划是不正常的; 如果声明出现在不同的翻译单元中,则无需诊断.[..]

这是一个缺陷吗?

c++ language-lawyer c++11 c++14 bsearch

45
推荐指数
1
解决办法
1739
查看次数

Ruby 2.0.0 Array #bsearch行为

我注意到,从Ruby 2.0.0开始,数组类有一个bsearch我正在测试的方法,而且我没有得到我期望的行为.为什么它返回2和5的值,但是nil-1,1和4?

arr_in = [-1, 1, 2, 4, 5]

arr_in.bsearch { |x| x == 3 }   #=> nil
arr_in.bsearch { |x| x == -1 }  #=> nil
arr_in.bsearch { |x| x == 1 }   #=> nil
arr_in.bsearch { |x| x == 2 }   #=> 2
arr_in.bsearch { |x| x == 4 }   #=> nil
arr_in.bsearch { |x| x == 5 }   #=> 5
Run Code Online (Sandbox Code Playgroud)

ruby arrays binary-search bsearch

19
推荐指数
2
解决办法
3882
查看次数

为什么bsearch会返回void*?

void * bsearch ( const void * key,
                 const void * base,
                 size_t num,
                 size_t size,
                 int ( * comparator ) ( const void *, const void * ) );
Run Code Online (Sandbox Code Playgroud)

如果我传入一个const void * base,不应该bsearch也返回一个const void *结果?

c pointers const void bsearch

10
推荐指数
1
解决办法
447
查看次数

使用bsearch查找用于将新元素插入到排序数组中的索引

我有一个排序的唯一数组,并希望有效地插入一个不在数组中的元素,如下所示:

a = [1,2,4,5,6]
new_elm = 3
insert_at = a.bsearch_index {|x| x > new_elm } # => 2
a.insert(insert_at, new_elm) # now a = [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

该方法bsearch_index不存在:only bsearch,返回匹配元素而不是匹配元素的索引.有没有内置的方法来实现这一目标?

ruby bsearch

10
推荐指数
4
解决办法
4317
查看次数

in_array()是否使用二进制搜索算法?

我有一个较大的字符串数组,我想用作查找.

我正在使用in_array(),但我怀疑它做了一个简单的循环 - 有没有人知道in_array()算法是否使用了bsearch算法?

php binary-search bsearch

7
推荐指数
2
解决办法
4263
查看次数

qsort()/ bsearch()的extern"C"和"C++"版本的重载分辨率

在C++中,qsort()标准库提供了两个版本:

extern "C" void qsort(void* base, size_t nmemb, size_t size, int (*compar)(const void*, const void*));
extern "C++" void qsort(void* base, size_t nmemb, size_t size, int (*compar)(const void*, const void*));
Run Code Online (Sandbox Code Playgroud)

bsearch() 差不多.

我的问题是,调用时重载解析如何工作qsort()?它是否根据作为最后一个参数传递的函数指针的链接类型("C"或"C++")自动链接到相应的函数?或者调用者需要使用某种额外的语法明确指定?

(让我们放下诱惑,呼唤std::sort一秒......)

c++ qsort bsearch

6
推荐指数
1
解决办法
322
查看次数

如何在数组 bsearch() 上找到插入点?

在 C(标准库)中使用 bsearch() 可以快速找到排序数组中的条目。

但是,如何计算插入新条目的位置(使用标准库)?

bsearch() 专门检查找到的项目的键是否等于传递的键,如果不是,则返回 NULL - 所以不能使用它。

c bsearch

5
推荐指数
2
解决办法
2027
查看次数

麻烦使用bsearch与字符串数组

我试图在C中的字符串数组上使用c builtin bsearch时遇到一些令人困惑的行为.这是代码.我知道你可以使用内置的strcmp来搜索字符串数组,但我包含myStrCmp用于调试目的,因为我不知道为什么它不起作用.

const char *stateNames[] = {"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "Washington DC", "West Virginia", "Wisconsin", "Wyoming"};

int myStrCmp(const void *s1, const void *s2) {
  printf("myStrCmp: s1(%p): %s, …
Run Code Online (Sandbox Code Playgroud)

c bsearch

5
推荐指数
1
解决办法
3597
查看次数

C++函数指针作为Doxygen中的参数

我有一种情况需要在Doxygen中记录bsearch()签名.签名看起来像这样:

void * __cdecl bsearch (
    const void *key,
    const void *base,
    size_t num,
    size_t width,
    int(__cdecl *compare)(const void *, const void *)
    )
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是如何为指针*比较组成@param命令,因为Doxygen抱怨" 命令@param的参数'比较'在bsearch的参数列表中找不到 "我投入的所有内容.

这是一个独立的实现,所以它不依赖于库签名,但我想如果我这样做:

typedef int(__cdecl *pcompare)(const void *, const void *);
Run Code Online (Sandbox Code Playgroud)

将签名更改为pcompare比较使用标准签名的调用者会出现类型问题.

我对任何解决方案持开放态度,允许我在没有Doxygen警报的情况下记录这个问题.

c++ doxygen bsearch

3
推荐指数
1
解决办法
516
查看次数

如何使用std :: bsearch的成员函数

我有一个C++类,但我也使用一些低级C并需要使用该bsearch函数.最后一个参数bsearch是比较函数,我希望以允许它访问类的const私有变量的方式实现所述函数.

问题是,如果我将比较函数作为成员函数,它将无法工作,因为它不能转换为常规函数指针.如果我创建一个非成员函数,我可以将其传递给bsearch,但是无法访问该类的私有变量.

该怎么办?

例: 在此输入图像描述

3表示有3个元素.16,32,56是偏移​​字节.我需要bsearch来搜索actors.I我在偏移数组中搜索.我需要一个比较函数来比较actor但我也需要const void*actorFile用于计算比较函数中位置的指针.actorFIle是类私有变量.

c c++ class bsearch

3
推荐指数
1
解决办法
160
查看次数

标签 统计

bsearch ×10

c ×4

c++ ×4

binary-search ×2

ruby ×2

arrays ×1

c++11 ×1

c++14 ×1

class ×1

const ×1

doxygen ×1

language-lawyer ×1

php ×1

pointers ×1

qsort ×1

void ×1