繁体   English   中英

在std :: string数组上进行二进制搜索

[英]Binary Search on a std::string array

下面是代码和

std::string str[5] = {"Tejas","Mejas","Rajas","Pojas","Ljas"};
std::sort(str,str+5);
size_t test =  bin_search("Ljas",str,5);

这是二进制搜索的通用函数

 template<class T>
    size_t bin_search(T x,  T* array, int  n)
     {
     size_t begin = 0, end = n;
            // Invariant: This function will eventually return a value in      the range [begin, end]
             while (begin != end) {
                       size_t mid = (begin + end) / 2;
                       if (array[mid] < x) {
                              begin = mid + 1;
                       } else {
                                 end = mid;
                       }
      }
     return begin;   // Or return end, because begin == end
}

错误是

 main.cpp|12|error: no matching function for call to 'bin_search(const char [5], std::string [5], int)'|

只有std::string数组存在问题,但int数组工作得很好。 它是否适用于字符串数组或逻辑中是否缺少任何内容?

正如错误消息试图告诉你的那样, "Ljas"不是std::string ,它是const char[5] 然后模板参数推导失败,因为无法推导出类型T (作为const char*std::string )。

您可以显式地将其std::stringstd::string以使模板参数推导工作正常:

size_t test =  bin_search(std::string("Ljas"),str,5);

或者显式指定模板参数以避免模板参数推断:

size_t test =  bin_search<std::string>("Ljas",str,5);

size_t test = bin_search(std::string("Ljas"), str, 5); 也许?

template<class T>
size_t bin_search(T x,  T* array, int  n)

期待你收到一个T和一个指向T的指针。当编译器扣除类型时

size_t test =  bin_search("Ljas",str,5);

x被推导为const char[5]因为所有字符串文字都具有const char[N]类型。 array推导出std::strign[5] 由于cont char[]std::string[]不是同一类型,因此将生成no函数。 你需要让"Ljas"成为一个字符串

size_t test =  bin_search(std::string("Ljas"),str,5);

另请注意,传递给二进制搜索的集合需要进行排序。 如果数据没有排序,那么你无法推断元素的一半应该是什么。

  • 即使您修复了编译错误,您的算法也无法工作,因为二进制搜索需要排序数组。
  • 没有必要编写自己的二进制搜索算法,STL已经有了一个: http//en.cppreference.com/w/cpp/algorithm/binary_search
  • 你的第一个参数应该是std :: string,而不是字符串文字: bin_search(std::string("Ljas"),str,5);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM