![](/img/trans.png)
[英]How to sort an array of structs with std::binary_search or std::sort
[英]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::string
为std::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);
另请注意,传递给二进制搜索的集合需要进行排序。 如果数据没有排序,那么你无法推断元素的一半应该是什么。
bin_search(std::string("Ljas"),str,5);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.