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

时间:2016-04-13 14:57:33

标签: c++ arrays string templates c++11

以下是代码和

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数组工作正常。 它是否适用于字符串数组或逻辑中是否缺少任何内容?

4 个答案:

答案 0 :(得分:6)

正如错误消息试图告诉您的那样,"Ljas"不是std::string,而是const char[5]。然后template argument deduction失败,因为无法推断类型Tconst char*std::string)。

您可以明确地将其强制转换为std::string,以使模板参数推断工作得很好:

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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);

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

答案 3 :(得分:0)

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