以下是代码和
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
数组工作正常。
它是否适用于字符串数组或逻辑中是否缺少任何内容?
答案 0 :(得分:6)
正如错误消息试图告诉您的那样,"Ljas"
不是std::string
,而是const char[5]
。然后template argument deduction失败,因为无法推断类型T
(const 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)
bin_search(std::string("Ljas"),str,5);